2013-10-24 12 views
1

我們正在對嵌入式/嵌套式XML執行一些操作。我正在使用SAXParser來解析整個XML文件。我想要通過標籤獲取整個嵌套XML和value.For例如我的XML看起來像。如何使用SAX解析器從大型XML文件中獲取嵌入/嵌套XML

我希望整個XML在<ANY_ELEMENT> ..... < /ANY-ELEMENT>標記。

<?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內容,所以給我nothing.SO如何去實現它。 編輯:你可以自由地修改XML <ANY-ELEMENT>後,如添加內容到CDATA

回答

0

相反SAX的,我會建議使用的StAX(一StAX的實現,因爲Java SE 6中包含在JDK/JRE)。除了將事件推送給您之外,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"); 
    } 

} 
+0

感謝Blasise您answer.For暫且我只是推杆入CDATA和相同代碼工作之間的所有數據。 –