Java StAX XML两个必需标记之间的所有内容
开始使用XMLStreamReader学习StAX时,我遇到了一些问题。如何将标记之间的所有内容作为文本获取?我的意思是,我知道所需标记的名称,当我找到它时,我必须转到close标记,我在它们之间找到的所有内容都必须附加到某个字符串。 例如,我们有类似于Java StAX XML两个必需标记之间的所有内容,java,xml,xml-parsing,stax,xmlstreamreader,Java,Xml,Xml Parsing,Stax,Xmlstreamreader,开始使用XMLStreamReader学习StAX时,我遇到了一些问题。如何将标记之间的所有内容作为文本获取?我的意思是,我知道所需标记的名称,当我找到它时,我必须转到close标记,我在它们之间找到的所有内容都必须附加到某个字符串。 例如,我们有类似于 <rootTag> ... <someTag> Some text content and other tags here… </someTag > <t
<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中找到所需块的起始偏移量和结束偏移量,并在解析后给出子字符串?在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来获得所需的结果。试试看
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>
E.Dorofev的解决方案是好的,但如果有一个同名的内部标签,它就失败了。我加了一个柜台
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事件4][Stax事件1][Stax事件4][Stax事件1][Stax事件4][Stax事件2][Stax事件4][Stax事件4][Stax事件4][Stax事件4][Stax事件2][Stax事件2][Stax事件4][Stax事件1][Stax事件4][Stax事件2][Stax事件4]嗯,输出是真实的。。我的StAX是Java 7 internal com.sun.xml.internal.stream.XMLInputFactoryImpl。你的StAX是什么?无论如何,试试我的更新版本,它不依赖于StAX imple-只是事件的类型。。我的问题是如何在不检查类型的情况下以文本形式获取当前位置的内容。用于不执行以下操作:if(e==XMLStreamConstants.START_元素){System.out.println(“”;}else if(e==XMLStreamConstants.END_元素){System.out.println(“”;}else if(e==XMLStreamConstants.CHARACTERS){System.out.println(reader.getText();}抱歉,我不明白..我必须从com.sun.xml.internal.stream导入XMLInputFactory?但是这个包中没有这样的类…我可以要求您在这里发布完整的程序文本,并带有“导入”部分吗?
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);