繁体   English   中英

如何使用SAX解析器从大XML文件中获取嵌入/嵌套XML

[英]How to get Embeded/nested XML from a big XML file using SAX parser

我们正在对嵌入式/嵌套XML执行一些操作。我正在使用SAXParser解析整个XML文件。我想获取带有标签和值的整个嵌套XML。例如我的XML看起来像。

我想要<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>

处理程序类示例代码:

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

}

但是由于XML内容之后是下一个元素,所以什么也没给我。所以如何实现它。 编辑:您可以在<ANY-ELEMENT>之后随意修改XML,例如将内容添加到CDATA

我建议使用StAX(而不是SAX)(自Java SE 6开始,JDK / JRE中包含StAX实现)。 StAX与SAX相似,只是您拉(请求)事件而不是将事件推送给您。

在下面的代码中, XMLStreamReader前进到ANY-ELEMENT元素。 一旦它处于正确的位置,您就可以根据需要与其进行交互。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM