簡體   English   中英

SAX解析器可以在Java中使用XPath嗎?

[英]Can SAX Parsers use XPath in Java?

我試圖將我的使用DOM解析和大量XPath表達式的類之一遷移到SAX解析。 DOM解析對我很有用,但是我嘗試解析的某些文件太大,它們導致服務器超時。 我想通過SAX解析重用XPath ,但是我不確定是否可以,如果不能,請您幫我,因為我不知道當我僅使用SAX時以下代碼將如何:

Document doc = bpsXml.getDocument();
String supplierName = BPSXMLUtils.getXpathString(doc, "/Invoice/InvoiceHeader/Party[@stdValue='SU']/Name/Name1");
String language = BPSXMLUtils.getXpathString(doc, "/Invoice/InvoiceHeader/InvoiceLanguage/@stdValue");

僅僅使用SAX解析器將無法在內存中建立XML樹的表示(這就是SAX可以提高內存效率的原因)。 每當遇到新的XML元素時,它只會觸發“事件”。 您必須將上下文(通常是父元素的堆棧)保留在內存中,以“知道”您在樹中的位置。

由於您的內存中沒有樹,因此您將無法使用XPath。 您只能測試當前的“上下文”(您的手動排版托管堆棧)以查詢文檔。請記住,SAX解析器僅對文件運行一次,因此文件的順序很重要。

幸運的是,還有其他方法,例如VTD-XML ,它是一個在內存中構建XML樹的庫,但僅是結構部分,它不從文件中提取實際內容,而是按需提取內容。 它比DOM解析器具有更高的內存效率,同時仍允許使用XPath。 我個人使用該庫在工作時使用XPath解析約700MB的XML文件(是的,但很瘋狂,但是它非常快。)

恕我直言,處理XML的最簡單方法是使用StAX (XML的流API)。 它結合了DOM和SAX的優點(並為您提供了更輕松的遷移)。 您仍然可以將光標移動到XML元素(例如SAX中),但是代碼會將光標向前移動。 這提供了XML處理代碼更具可讀性的巨大優勢。 它也解決了內存問題,因為僅當前XML元素必須保留在內存中。 這也是一個不錯的教程

還要回答您的原始問題:在Google上進行的簡短搜索向我展示了一種沒有簡單且被廣泛接受的方法,這可能意味着所有自定義解決方案都不可靠,未維護且未經良好測試。

切換到SAX解析(或StAX)將需要對您的方法進行徹底更改。 看起來您似乎還沒有完全意識到它會做多少工作。 對於任何有意義的建議,我們需要知道文件有多大,以及您希望對數據進行什么樣的處理。 例如,如果要過濾數據,那么使用文檔投影的XQuery實現可能是一個很好的答案(這將在后台自動使用SAX來構建僅包含您實際感興趣的數據子集的樹) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM