[英]How to get Embeded/nested XML from a big XML file using SAX parser
We are performing some operations on embedded/Nested XML.I am using SAXParser to parse the entire XML file.I want to get the entire nested XML with tags and value.For example my XML looks like. 我们正在对嵌入式/嵌套XML执行一些操作。我正在使用SAXParser解析整个XML文件。我想获取带有标签和值的整个嵌套XML。例如我的XML看起来像。
I want entire XML within the <ANY_ELEMENT>
.....< /ANY-ELEMENT>
tag. 我想要
<ANY_ELEMENT>
..... < /ANY-ELEMENT>
标记内的整个XML。
<?xml version="1.0" encoding="UTF-8"?>
<x:xMessage xmlns:x="http://www.connecture.com/integration/x" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.connecture.com/integration/x xMessageWrapper.xsd
">
<x:xMessageHeader>
<Version>850</Version>
<Source>Source</Source>
<Target>target</Target>
<Timestamp>2013-12-31T12:00:00</Timestamp>
<RequestID>123456</RequestID>
<ResponseID>54321</ResponseID>
<Priority>3</Priority>
<Username>Deepak</Username>
<Password>Kumar</Password>
</x:xMessageHeader>
<x:xMessageBody>
<ANY-ELEMENT>
<xEnveloped_834A1 xsi:schemaLocation="....." xmlns="......."
..........................
..........................
some Complex XML
..........................
..........................
..........................
</ANY-ELEMENT>
</x:XMessageBody>
</x:XMessage>
Handler class Sample code: 处理程序类示例代码:
public class MessageWrapperHandler extends DefaultHandler {
private boolean bActualMessage = false;
private String actualMessage = null;
private long lengthActualMessage=0;
public void startElement(String uri, String localName, String qName, Attributes attributes) {
if (qName.equalsIgnoreCase("ANY-ELEMENT")) {
bActualMessage = true;
//lengthActualMessage=How to know the length of Child XML
}
}
public void characters(char ch[], int start, int length) {
if (bActualMessage) {
actualMessage = new String(ch, start, length);
//trying to get embedded XML
bActualMessage = false;
}
}
}
But since next element after is XML content so giving me nothing.SO How to achieve it. 但是由于XML内容之后是下一个元素,所以什么也没给我。所以如何实现它。 EDIT: You are free to modify XML after
<ANY-ELEMENT>
like adding contents into CDATA
编辑:您可以在
<ANY-ELEMENT>
之后随意修改XML,例如将内容添加到CDATA
Instead of SAX, I would recommend using StAX (a StAX implementation is included in the JDK/JRE since Java SE 6). 我建议使用StAX(而不是SAX)(自Java SE 6开始,JDK / JRE中包含StAX实现)。 StAX is similar to SAX except instead of having the events pushed to you, you pull (request) them.
StAX与SAX相似,只是您拉(请求)事件而不是将事件推送给您。
In the code below the XMLStreamReader
is advanced to the ANY-ELEMENT
element. 在下面的代码中,
XMLStreamReader
前进到ANY-ELEMENT
元素。 Once it is at the correct position you can interact with it as you wish. 一旦它处于正确的位置,您就可以根据需要与其进行交互。
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;
public class Demo {
public static void main(String[] args) throws Exception {
XMLInputFactory xif = XMLInputFactory.newFactory();
StreamSource xmlSource = new StreamSource("src/forum19559825/input.xml");
XMLStreamReader xsr = xif.createXMLStreamReader(xmlSource);
Demo demo = new Demo();
demo.positionXMLStreamReaderAtAnyElement(xsr);
demo.processAnyElement(xsr);
}
private void positionXMLStreamReaderAtAnyElement(XMLStreamReader xsr) throws Exception {
while(xsr.hasNext()) {
if(xsr.getEventType() == XMLStreamReader.START_ELEMENT && "ANY-ELEMENT".equals(xsr.getLocalName())) {
break;
}
xsr.next();
}
}
private void processAnyElement(XMLStreamReader xmlStreamReaderAtAnyElement) {
// TODO: Stuff
System.out.println("FOUND IT");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.