java - 分析inputstream xml格式java
问题描述
我有一个包含 xml 格式的InputStream,如下所示:-
InputStream is = asStream("<TransactionList>\n" +
" <Transaction type=\"C\" amount=\"1000\"narration=\"salary\" />\n" +
" <Transaction type=\"X\" amount=\"400\" narration=\"rent\"/>\n" +
" <Transaction type=\"D\" amount=\"750\" narration=\"other\"/>\n" +
"</TransactionList>");
xmlTransactionProcessor.importTransactions(is);
我正在尝试对此进行分析并将值存储到 Transaction 对象(用户定义)的数组列表中,但我仍然无法这样做。
我尝试了许多解决方案,但仍然没有得到任何好处。
我阅读了有关读取 xml 文件的信息,但仍然无法处理这样的 InputStream。
有人可以帮忙吗?这是我最后一次尝试,但它仍然在某个地方失败。
// TODO Auto-generated method stub
BufferedReader inputReader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String inline = "";
try {
while ((inline = inputReader.readLine()) != null) {
sb.append(inline);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SAXBuilder builder = new SAXBuilder();
try {
org.jdom2.Document document = (org.jdom2.Document) builder.build(new ByteArrayInputStream(sb.toString().getBytes()));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
解决方案
您不必使用 SAX 解析器自己解析 XML。有几个库允许XML 绑定:将 XML 文档序列化和反序列化为自定义 POJO 类(或这些类的集合)。
JDK 中甚至还有一个用于 XML 绑定的标准。它被称为JAXB。您可以使用注释将 XML 元素名称映射到自定义 POJO 的属性。
这是我个人最喜欢的图书馆的一个例子:杰克逊。它主要用于处理 JSON 格式的文本,但具有支持 XML(和 JAXB) 的扩展。
import java.util.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.dataformat.xml.*;
public class XMLTest
{
public static void main(String[] args)
{
String input =
"<TransactionList>\n" +
" <Transaction type=\"C\" amount=\"1000\" narration=\"salary\" />\n" +
" <Transaction type=\"X\" amount=\"400\" narration=\"rent\"/>\n" +
" <Transaction type=\"D\" amount=\"750\" narration=\"other\"/>\n" +
"</TransactionList>";
try {
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.setDefaultUseWrapper(false);
// this is how we tell Jackson the target type of the deserialization
JavaType transactionListType = xmlMapper.getTypeFactory().constructCollectionType(List.class, Transaction.class);
List<Transaction> transactionList = xmlMapper.readValue(input, transactionListType );
System.out.println(transactionList);
} catch (Exception e) {
e.printStackTrace();
}
}
public static class Transaction
{
public String type;
public int amount;
public String narration;
@Override
public String toString() {
return String.format("{ type:%s, amount:%d, narration:%s }", type, amount, narration);
}
}
}
推荐阅读
- css - 将 Css 表单与页面中心对齐(是的,我查看了其他答案,我无法让它工作)
- r - 使用 lon,lat 坐标在地图中绘制风玫瑰图
- html - 表格每一行的 HTML/PHP 内联更新和删除
- jquery - 甜蜜警报删除();确认时
- haskell - 将域建模为 GADT 类型并为其提供 do-sugar
- string - 将加密数据转换为字符串并返回
- python - 如何将函数列表应用于相应参数列表*快速*
- r - 可以在闪亮的 navbarPage 中显示 messageItem 吗?
- ruby-on-rails - Active Storage,指定一个谷歌存储桶目录?
- python - 在自定义发票报告的系统中找不到 odoo V8 外部 ID