2013-08-05 98 views
1

所以,我有一個像SAX解析器跳過一些不被解析的元素?

<root> 
    <transaction ts="1"> 
    <abc><def></def></abc> 
    </transaction> 
    <transaction ts="2"> 
    <abc><def></def></abc> 
    </transaction> 
</root> 

這樣一個文件,我有說,如果TS =「2」,然後做一些事情......現在的問題是,當它發現TS =「1」,這還算是一種條件掃描標籤< abc> < def>然後達到<事務ts =「2」>

當條件與解析中斷不匹配並直接查找下一個事務標記時,有沒有辦法?

+1

你不能改變任何生成文件,以確保它產生有效的XML開始嗎?請注意,即使您的「ts = 2」元素也是無效的... –

+0

這不是有效的XML。 「」和「」的嵌套無效。這真的是XML的樣子嗎?我懷疑它是,而你的SAX解析器忽略了可能導致你看到的行爲的結束標籤。 –

+0

啊..不要擔心XML有效性是一個有效的XML .. – user2601010

回答

0

SAX解析器必須掃描所有子樹(如您的「< abc> < def> </def> </abc>」)以知道下一個元素的起始位置。無法繞過它,這也是無法爲單個XML文檔並行化XML解析器的原因。

調整的只有兩種方式,我可以在你的情況考慮的:

1)如果你有很多的XML文檔解析,您可以在自己的線程每個文件運行一個分析器。這至少可以並行處理整個工作並利用所有可用的CPU和內核。 2)如果您只需要閱讀某個條件(例如您提到的<事務ts =「2」>),則可以在達到該條件時立即跳過解析。如果跳過解析器會有所幫助,通過拋出異常來實現這一點。

你執行的ContentHandlerstartElement應該是這樣的:

public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { 
    if(atts == null) return; 
     if(localName.equals("transaction") && "2".equals(atts.getValue("ts"))) { 
      // TODO: Whatever should happen when condition is reached 
      throw new SAXException("Condition reached. Just skip rest of parsing"); 
     } 
    } 
0

當條件與解析中斷不匹配並且 直接查找下一個事務標記時,是否有方法?

不需要。您必須編寫SAX解析器才能知道何時忽略壞事務塊中的標記。也就是說,你可能會發現切換到STAX比SAX更容易做這樣的事情。

0

薩克斯解析器總是爲每個XML元素調用回調函數。
一旦檢測到要忽略的條件,您就可以通過設置字段isIgnoreCurrentTransaction來解決您的問題。然後在你的其他sax回調中,你檢查isIgnoreCurrentTransaction amd在這種情況下什麼也不做。

+0

但即使在這種情況下..它會查看元素的權利一次,然後當它看到isIgnoreCurrentTransaction標誌設置它將會跳過它..但它仍然會通過標記來查看標記是否設置 – user2601010

+0

是sax總是遍歷所有元素,因此您的工作是在您的Saxhandler中忽略startElemnt(),endElement()和字符() – AlexWien

0

您可以在您的SAX實施中使用控制標誌,當您在特定標籤上檢測到您的狀況時引發該標誌,並在您退出標籤後再次降低標誌。您可以使用該標記跳過任何處理,當解析器運行通過您不感興趣的標記的子項時。

但請注意,您的示例XML無效。正如評論中所述,您需要正確嵌套您的標籤才能使用SAX實施進行處理。

+0

您能否提供示例代碼或示例源代碼的鏈接? –