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

时间:2012-12-27 08:56:52

标签: java xml xml-parsing stax xmlstreamreader

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

的东西
<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中找到所需块的开始和结束偏移量,并在解析后给出子串?

3 个答案:

答案 0 :(得分:6)

尝试

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

答案 1 :(得分:0)

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

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来获得所需的结果。

答案 2 :(得分:0)

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