[英]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文件(是的,但很瘋狂,但是它非常快。)
切換到SAX解析(或StAX)將需要對您的方法進行徹底更改。 看起來您似乎還沒有完全意識到它會做多少工作。 對於任何有意義的建議,我們需要知道文件有多大,以及您希望對數據進行什么樣的處理。 例如,如果要過濾數據,那么使用文檔投影的XQuery實現可能是一個很好的答案(這將在后台自動使用SAX來構建僅包含您實際感興趣的數據子集的樹) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.