同じ行に終了要素と開始要素を持つStax発行の解析文書

Staxを使用してXMLファイルの要素をStringに変換するための次のコードがあります。

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フラグメントでうまく動作します。


  
    hello world
    hello world again
  
  
    foo
    foo bar
  

However, there are problems with this fragment where the and are on the same line:


  
    hello world
    hello world again
  
    foo
    foo bar
  

2番目の例では、2番目の例ではなく最初の要素のみを処理するように見えます。何か案は?

更新:

私はそれを次のコードで動作させました:

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();
        }

    }
}
1

1 答え

私のバグのように見えます。あなたはあなたが使っているStaxパーサを言っていない:それらのいくつかはかなりropeyです。ウッドストックは最も信頼できるものです。

2
追加された