StAX XML весь контент между двумя обязательными тегами
Начав изучать 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 и дать подстроку после анализа?
3 ответа
Пытаться
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>
Решение Е. Дорофеева хорошо, но не получается, если есть внутренний тег с таким же именем. Я добавил счетчик.
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);
В 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 для получения желаемого результата.