簡體   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