-->

StAX的XML需要两个标记之间的所有内容(StAX XML all content between

2019-08-04 18:44发布

开始学习StAX的,使用XMLStreamReader的,我面临着一些问题。 我怎样才能获得的标签,文本之间的所有内容吗? 我的意思是,我知道需要标签的名字,当我找到它,我必须去关闭标签,一切都我他们之间发现我必须在一些字符串追加。 例如,我们有一些像

<rootTag>
...    
    <someTag>
        Some text content and other tags here…
    </someTag >
    <tagINeed>
        <someinternalTag1>
            <someinternalTag11>
                Some text content..
            </someinternalTag11>
            ...
        </someinternalTag1>
        <someinternalTag2>
            Something here
        </someinternalTag2>
    </tagINeed>
...
    <somethingAnother>
...
    </somethingAnother >
...
</rootTag>    

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

        <someinternalTag1>
            <someinternalTag11>
                Some text content..
            </someinternalTag11>
            ...
        </someinternalTag1>
        <someinternalTag2>
            Something here
        </someinternalTag2>

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

Answer 1:

尝试

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

版画

    <someinternalTag1>
        <someinternalTag11>
            Some text content..
        </someinternalTag11>
    </someinternalTag1>
    <someinternalTag2>
        Something here
    </someinternalTag2>

更新:

如果你需要XML字符串,我们也可以写这样的:

        if (e.isStartElement() &&
                ((StartElement) e).getName().getLocalPart().equals("tagINeed")){
            xw = of.createXMLEventWriter(sw);
            xw.add(e);
        } else if (e.isEndElement() &&
                ((EndElement) e).getName().getLocalPart().equals("tagINeed")){
            xw.add(e);
            break;
        } else if (xw != null) {
            xw.add(e);
        }


Answer 2:

在XML一切都是一个节点,STAX,您可以通过这些节点逐一遍历。 我觉得你想要的结果可以通过XML转换成字符串,然后搜索使用变压器所需的字符串来获得。

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得到期望的结果。



Answer 3:

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


文章来源: StAX XML all content between two required tags