【问题标题】:Stax issue parsing document which have an end element and start element on the same lineStax问题解析文档在同一行上具有结束元素和开始元素
【发布时间】:2011-12-19 06:09:41
【问题描述】:

我有以下代码用于使用 Stax 将 XML 文件的元素转换为字符串:

private static XMLStreamReader getReader(InputStream inputStream) throws XMLStreamException {
    XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
    xmlInputFactory.setProperty("javax.xml.stream.isValidating", false);
    xmlInputFactory.setProperty("javax.xml.stream.supportDTD", false);
    XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(inputStream);
    return xmlStreamReader;
}

private static String readElement(XMLStreamReader reader) throws XMLStreamException, TransformerException {
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer t = tf.newTransformer();
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    StAXSource source = new StAXSource(reader);
    t.transform(source, new StreamResult(outputStream));
    return outputStream.toString();
}

public static void main(String[] args) throws Exception {
    InputStream inputStream = new FileInputStream("c:\\temp\\test.xml");

    XMLStreamReader xmlStreamReader = getReader(inputStream);
    int count = 0;
    while (xmlStreamReader.hasNext()) {
        int eventType = xmlStreamReader.next();
        if (eventType == XMLEvent.START_ELEMENT) {
            String elementName = xmlStreamReader.getName().getLocalPart();
            if (!elementName.toLowerCase().equals("element")) {
                continue;
            }
            String productStr = readElement(xmlStreamReader);
            System.out.println(productStr);
        }
    }
}

}

这适用于以下 XML 片段:

<testDoc>
  <element>
    <a>hello world</a>
    <b>hello world again</b>
  </element>
  <element>
    <a>foo</a>
    <b>foo bar</b>
  </element>
</testDoc>

但是,此片段存在&lt;/element&gt;&lt;element&gt; 位于同一行的问题:

<testDoc>
  <element>
    <a>hello world</a>
    <b>hello world again</b>
  </element><element>
    <a>foo</a>
    <b>foo bar</b>
  </element>
</testDoc>

在第二个示例中,它似乎只处理第一个元素而不是第二个元素。有什么想法吗?

更新:

我让它与以下代码一起工作:

public static void main(String[] args) throws Exception {
    InputStream inputStream = new FileInputStream("c:\\temp\\test.xml");

    XMLStreamReader xmlStreamReader = getReader(inputStream);
    int count = 0;
    while (xmlStreamReader.hasNext()) {
        int eventType = xmlStreamReader.getEventType();
        if (eventType == XMLEvent.START_ELEMENT) {
            String elementName = xmlStreamReader.getName().getLocalPart();
            if (!elementName.toLowerCase().equals("element")) {
                xmlStreamReader.next();
                continue;
            }

            System.out.println(readElement(xmlStreamReader));
        } else {
            xmlStreamReader.next();
        }

    }
}

【问题讨论】:

    标签: java xml stax


    【解决方案1】:

    对我来说似乎是一个错误。您没有说您使用的是哪个 Stax 解析器:其中一些非常复杂。 Woodstox 是最可靠的。

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 2014-06-30
      • 1970-01-01
      • 2013-11-02
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      相关资源
      最近更新 更多