我有一個非常大的XML,我收到作爲輸入。從這個XML我只需要一個子元素。解析整個XML只檢索一個元素似乎是一種性能矯枉過正。有沒有更好的方法來解決這個問題?XML分析:解析整個XML的一個字段
一種方法是使用DocumentBuilder API分析XML,然後使用XPath檢索所需的字段。但解析方法仍然會不必要地解析整個xml。在解析器的任何實現中,是否存在一個重載的解析方法,該解析器接受xpath並僅根據XPath解析XML。
我有一個非常大的XML,我收到作爲輸入。從這個XML我只需要一個子元素。解析整個XML只檢索一個元素似乎是一種性能矯枉過正。有沒有更好的方法來解決這個問題?XML分析:解析整個XML的一個字段
一種方法是使用DocumentBuilder API分析XML,然後使用XPath檢索所需的字段。但解析方法仍然會不必要地解析整個xml。在解析器的任何實現中,是否存在一個重載的解析方法,該解析器接受xpath並僅根據XPath解析XML。
你需要的是一個SAX解析器或類似的快速解析器。 SAX解析器不分析整個XML,他們只是解析xml直到找到他們正在尋找的元素。
您可以在wikipedia's link中閱讀關於SAX解析器的內容。也看看the java docs for SAX parser
雖然沒有辦法解決您的XML數據的正確處理方法,但確實有辦法在整個文檔中構建內存中表示。 Java提供SAX解析,這是基於事件的。您可以實現XML事件的事件處理程序,忽略所需內容的所有內容,並在檢索到要查找的部分後停止。
由於most XPath processors work with SAX as well,您可能會將事件提供給XPath處理器,並以此方式查找所需的標記。但是,當您需要獲取單個元素時,這可能是一種矯枉過正的情況。
XPath operates over the document object model.所以你必須有一個DOM來評估一個XPath表達式。否則,它會驗證什麼?
因此,如果您不想解析文檔,那麼XPath就不存在了。您的其他選項是快速SAX解析,您可以忽略所有SAX解析事件,直到找到所需的元素,提取所需的文本,然後放棄解析過程的其餘部分。
另一種選擇是去簡單的方法:用grep.
考慮使用STAX。 http://stackoverflow.com/questions/7215931/reading-huge-xml-file-using-stax-and-xpath –