2013-10-24 3 views
1

임베디드/중첩 XML에 대해 몇 가지 작업을 수행하고 있습니다. SAXParser를 사용하여 전체 XML 파일을 구문 분석하고 있습니다. 태그가있는 전체 중첩 XML을 가져 오려고합니다. 그리고 value.For 예를 들어, 내 XML 모양.SAX 파서를 사용하여 큰 XML 파일에서 Embeded/Nested 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 내용 때문이다. 편집은 : 당신은 내가 StAX를 사용하는 것이 좋습니다 것 대신에 SAX의 CDATA

답변

0

에 추가하는 내용처럼 <ANY-ELEMENT> 후 XML을 자유롭게 변경할 수 있습니다 (A StAX의 구현은 자바 SE 6부터 JDK/JRE에 포함되어 있습니다). StAX는 SAX와 비슷하지만 이벤트가 푸시되는 대신 사용자가 요청 (요청)합니다.

아래 코드에서 XMLStreamReaderANY-ELEMENT 요소로 진행됩니다. 올바른 위치에 있으면 원하는대로 상호 작용할 수 있습니다. 당신의 answer.For 시간 인을위한

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 난 그냥 CDATA에 같은 코드가 작동 사이의 모든 데이터를 퍼트. –