2013-01-17 59 views
1

我有這樣一個xml:以內部XML使用SAX

<Message xmlns="uri_of_message"> 
    <VendorId>1234</VendorId> 
    <SequenceNumber>1</SequenceNumber> 
    ...other important headers... 
    <Data> 
    <Functions xmlns="uri_of_functions_subxml"> 
     <Function1 attr="sth"> 
     <Info>Some_Info</Info> 
     </Function1> 
     <Function2> 
     <Info>Some_Info</Info> 
     </Function2> 
     ...Functions n... 
    </Functions> 
    </Data> 
</Message> 

我需要提取內部XML

<Functions xmlns="uri_of_functions_subxml"> 
    <Function1 attr="sth"> 
    <Info>Some_Info</Info> 
    </Function1> 
    <Function2> 
    <Info>Some_Info</Info> 
    </Function2> 
    ...Functions n... 
</Functions> 

我人首先試圖得到內部XML與字符的方法:

public void startElement(String uri, String localName, String tagName, Attributes attributes) throws SAXException { 
if (tagName.equalsIgnoreCase("Data")){ 
    buffer = new StringBuffer();} 
} 
public void characters(char[] ch, int start, int length) throws SAXException { 
    if (buffer != null) { 
    buffer.append(new String(ch, start, length).trim()); 
    } 
} 
public void endElement(String uri, String localName, String tagName) throws SAXException { 
if (tagName.equalsIgnoreCase("Data")){ 
innerXML = buffer.toString().trim(); 
} 

但是後來我意識到字符方法沒有正確收集xml,它可能會拒絕特殊字符,如「<「,」>「。

下面的鏈接包含相同的問題,但答案不適用於我,因爲外部xml必須處理爲握手信號的種類,內部xml必須以完全不同的方式處理。

Java XML parsing: taking inner XML using SAX

只有我需要的是正確地收集內部XML。但是,怎麼做呢? 在此先感謝..

+1

你似乎並不理解SAX如何工作。您不能將XML標記視爲字符方法的內容。這種方法只能讀取XML文檔的***文本節點***(標籤之間的東西)。您的問題似乎更像是[StAX](http://en.wikipedia.org/wiki/StAX)的工作,而不是SAX。如果您準備好接受非SAX答案,我會告訴你如何做到這一點。 – predi

+0

我開始使用SAX時不明白的東西是當SAX框架在xml文檔中遇到不同類型的東西時調用的回調函數。 –

回答

4

SAX似乎不是做這項工作的最佳選擇,反正儘量

SAXParser p = SAXParserFactory.newInstance().newSAXParser(); 
    XMLReader filter = new XMLFilterImpl(p.getXMLReader()) { 
     private boolean inFunctions; 

     @Override 
     public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { 
      if (!inFunctions && qName.equals("Functions")) { 
       inFunctions = true; 
      } 
      if (inFunctions) { 
       super.startElement(uri, localName, qName, atts); 
      } else { 
       qName.equals("Functions"); 
      } 
     } 

     @Override 
     public void endElement(String uri, String localName, String qName) throws SAXException { 
      if (inFunctions) { 
       super.endElement(uri, localName, qName); 
       if (qName.equals("Functions")) { 
        inFunctions = false; 
       } 
      } 
     } 

     @Override 
     public void characters(char[] ch, int start, int length) throws SAXException { 
      if (inFunctions) { 
       super.characters(ch, start, length); 
      } 
     } 
    }; 
    Transformer t = TransformerFactory.newInstance().newTransformer(); 
    Source source = new SAXSource(filter, new InputSource(new FileInputStream("1.xml"))); 
    Result result = new StreamResult(System.out); 
    t.transform(source, result); 
} 

輸出

<?xml version="1.0" encoding="UTF-8"?><Functions xmlns="uri_of_functions_subxml"> 
     <Function1 attr="sth"> 
     <Info>Some_Info</Info> 
     </Function1> 
     <Function2> 
     <Info>Some_Info</Info> 
     </Function2> 
    </Functions> 

Official Tutorial

+1

謝謝Evgeniy,這段代碼工作起來就像一個魅力.. – user1873190

+0

很好的答案,它可能對別人有幫助 – Forhad