首页 > 解决方案 > 分析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();
    }

标签: javaxmlinputstream

解决方案


您不必使用 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);   
        }

    }
}

推荐阅读