2012-02-24 161 views
0

類似的標籤我有這樣的XML一個如何忽略XML SAX解析

<OuterTag> 
     <Name>JAVA 
     </Name> 
<InnerTag> 
    <Name> PHP 
    </Name> 
</InnerTag> 

</OuterTag> 

我只是想它包含的「Java」這個值。但是,當我解析它也帶來「PHP」,因爲本地名稱是相同的。是否可以過濾多個LocalNames並選擇我想要的?我怎樣才能做到這一點?

+0

如果您只需要從該XML中獲取一些任意值,那麼XPath會是您更好的選擇? – machinery 2012-02-24 16:23:37

回答

1

想法是保存你所在的狀態,只需使用布爾值並將其設置爲true,如果你找到'OuterTag'的開放標籤並且在你找到'InnerTag的開放標籤時將其設置爲false 」。

當你發現你的「名稱」標籤,現在,你是這個樣子。

另一種更靈活的方式是推動/當你發現他們流行的標記名稱。通過這種方式,您可以在找到「名稱」標籤時檢查誰是您的父標籤,然後獲取正確的值。

+0

我是SAX解析的起始者,如果你給我一個合適的方法代碼的例子,那麼它會更有幫助,謝謝 – 2012-02-24 16:03:09

+0

我已經實現了你的邏輯,它的工作原理:) – 2012-02-24 16:40:36

+0

^^不錯,它幫助:D – Moss 2012-02-24 18:33:08

0

如果我忽略correclty,您希望Name標記在OuterTag下,而不是InnerTag下的標記。所以,這是我如何與dom4j做到這一點:

SAXReader saxReader = new SAXReader(); 
    saxReader.addHandler("OuterTag/Name", new ElementHandler() { 

     @Override 
     public void onStart(ElementPath arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onEnd(ElementPath arg0) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    File inputFile = new File(filename); 
    saxReader.read(inputFile); 

我希望這有助於。

+0

你是對的,但我是SAX PARSING在這裏:) – 2012-02-24 16:16:00

+0

我認爲[SAXReader](http://dom4j.sourceforge.net/dom4j-1.6.1/apidocs/org/dom4j/io/SAXReader.html)做SAX解析。您可以指定您最喜歡的SAX解析器或「如果未明確指定解析器,則使用org.xml.sax.driver系統屬性的標準SAX策略來確定XMLReader的實現類。如果org.xml.sax .driver系統屬性未定義,則JAXP通過反射使用「 – MarcoS 2012-02-24 16:28:09

0

薩克斯語解析器通常有鉤子,您可以在其中編寫代碼,特別是StartElement,EndElementcharacters

莫斯有正確的答案 -

起始元素:按元素名稱到堆棧。

characters如果元素名稱是'name',並且堆棧上有一個「OuterTag」元素,那麼你找到了你的值。否則,忽略它。

EndElement將元素從堆棧中彈出。


請注意,sax解析器非常強大,但有時矯枉過正。速度非常快,適用於解析格式錯誤的xml或非常大的XML文件,並在解析器遇到它們時響應元素。

我會仔細地建議'考慮'XPath解決方案,它爲您解析工作,讓您輕鬆引用任何元素。創建一個Xpath對象並用類似於'/OuterTag/Name[1]'的方式對它進行查詢如果您以前使用過jQuery,那麼您就會在家。

但是,如果你的XML格式不正確,或者非常龐大而複雜,這可能會很慢。你已被警告。

只要知道XPath是可用的解決方案。 http://www.javabeat.net/tips/182-how-to-query-xml-using-xpath.html