StAX XML两个必需标记之间的所有内容

开始学习StAX,使用XMLStreamReader,我遇到了一些问题。 如何将标签之间的所有内容作为文本? 我的意思是,我知道所需标签的名称,当我找到它时,我必须转到关闭标签,我发现它们之间的一切我必须附加一些字符串。 例如,我们有类似的东西

 ...  Some text content and other tags here…     Some text content..  ...   Something here   ...  ...  ...  

所以,我需要把我的字符串作为

    Some text content..  ...   Something here  

我怎么才能得到它? 也许,我必须在源xml中找到所需块的开始和结束偏移,并在解析后给出子串?

尝试

  StringWriter sw = new StringWriter(); XMLOutputFactory of = XMLOutputFactory.newInstance(); XMLEventWriter xw = null; XMLInputFactory f = XMLInputFactory.newInstance(); XMLEventReader xr = f.createXMLEventReader(new FileInputStream("test.xml")); while (xr.hasNext()) { XMLEvent e = xr.nextEvent(); if (e.isStartElement() && ((StartElement) e).getName().getLocalPart().equals("tagINeed")) { xw = of.createXMLEventWriter(sw); } else if (e.isEndElement() && ((EndElement) e).getName().getLocalPart().equals("tagINeed")) { break; } else if (xw != null) { xw.add(e); } } xw.close(); System.out.println(sw); 

版画

    Some text content..    Something here  

在XML中,一切都是节点,STAX使您可以逐个遍历这些节点。 我认为您可以通过将XML转换为字符串然后使用Transformer搜索所需的String来获得所需的结果。

 Transformer t=TransformerFactory.newInstance().newTransformer(); StringWriter sw=new StringWriter(); StreamResult result=new StreamResult(sw);//holds the result of a transformation DOMSource d=new DOMSource(XMLdoc);//your XML document t.transform(d, result); String xmlstring=sw.toString(); 

您可以使用xmlstring来获得所需的结果。

E. Dorofeev的解决方案很好,但如果有一个同名的内部标签,它就会失败。 我加了一个柜台。

 String fichier="test_stax_2.txt"; String tag="tagINeed"; int count=0; StringWriter sw = new StringWriter(); XMLOutputFactory of = XMLOutputFactory.newInstance(); XMLEventWriter xw = null; XMLInputFactory f = XMLInputFactory.newInstance(); XMLEventReader xr = f.createXMLEventReader(new FileInputStream(fichier)); while (xr.hasNext()) { XMLEvent e = xr.nextEvent(); if (e.isStartElement() && ((StartElement) e).getName().getLocalPart().equals(tag)) { if (count==0) xw = of.createXMLEventWriter(sw); else xw.add(e); count++; } else if (e.isEndElement() && ((EndElement) e).getName().getLocalPart().equals(tag)) { count --; if (count==0) break; else xw.add(e); } else if (xw != null) { xw.add(e); } } if (xw!=null) xw.close(); System.out.println(sw);