2012-08-01 77 views
0

我有我在其上運行查詢,如下所述的XML。哪個解析器(sax或DOM或xpath)最適合通過id檢索查詢節點?哪個解析器:SAX,DOM或xpath?

你可以請一些示例代碼給我解釋一下,這樣可以幫助我很多嗎?

我想編寫一個泛型類,它通過id讀取查詢並將參數傳遞給它。在執行查詢後返回值的最佳方法是什麼,因爲每個查詢都可能返回一組不同的值?

<?xml version="1.0" encoding="UTF-8"?> 
<queries> 
    <query id="getUserByName"> 
     select * from users where name=? 
    </query> 
    <query id="getUserByEmail"> 
     select * from users where email=? 
    </query> 
</queries> 
+0

請參考http://stackoverflow.com/questions/9758882/xml-parsing-using-java-with-getting-element-values-and-attribute-values – amicngh 2012-08-01 13:23:08

+1

如果你想在xml中存儲sql查詢,爲什麼不使用MyBatis的?您不必編寫查詢檢索代碼,您的jdbc代碼就會消失,並且您可以免費獲得緩存等功能。 – 2012-08-01 13:27:57

回答

4

它主要取決於用例。

如果一般說話,SAX Parser適用於解析大文件,dom parser適用於替代方案。

原因是dom parser最終在解析大型文件/輸入流時佔用了足夠的內存。

在我看來,它需要有一定的經驗才能最好地利用Sax Parser。比較而言,dom解析更容易學習和使用。

或者Apaches commons-digester可以作爲替代建議,如果使用情況許可比薩克斯更容易,並且在內部使用薩克斯。

xpath不是解析器。


對於您的情況,您不需要解析器。我認爲你正在尋找xpath來使用xpath來檢索sql查詢。

如果您需要爲簡單的xml生成新的xml,則可以手動執行此操作。我現在不能提出任何更好的選擇。

2

從技術上講,XPath不是查詢,而是a query language for selecting nodes from an XML document

SaX和DOM的主要區別在於DOM會將所有文檔加載到內存結構中。對於小型XML文檔,您不會遇到太多麻煩,但對於大型XML文檔,內存使用可能會成爲問題。另一方面,SaX將以流方式處理XML文檔,因此最終沒有代表整個文檔的對象模型。相反,您需要跟蹤自己在文檔中遇到的數據。

對於這種情況,我的選擇是使用SaX並跟蹤文檔中的所有查詢,例如在Map<String, String>(其中鍵是查詢ID,值是查詢本身)。

+0

@BlaiseDoughan必須拒絕告訴他使用JAXB的衝動:) – 2013-04-22 16:59:38

1

DOM規範定義了基於樹的方法來進行導航的XML文檔,由此解析器掃描通過XML數據 該SAX規範定義的事件爲基礎的方法,在調用處理程序函數每當文件 的SAX的強度的某些部分規範是它可以掃描並解析千兆字節的XML文檔而不會觸及資源限制

2

更好的是可用性和程序員生產力:SAX最差,XPath最好。

在節省機器週期方面更好:SAX最好,XPath最差。

所以這取決於你的程序員是否比你的電腦花費更多。通常他們這樣做。

3

如果你真的把SQL放入XML然後執行,我會使用MyBatis。

如果您不想使用MyBatis,則應該使用JAXB並將整個XML作爲查詢對象列表加載,因爲您不想爲每個查詢重新分析XML。讓我告訴你,JAXB是多麼容易:

@XmlRootElement(name = "queries") 
public class Queries { 
    @XmlElement(name = "query") 
    public List<Query> queries; 
} 

public Query { 
    @XmlAttribute 
    public String id; 
    @XmlValue 
    public String sql; 
} 

Queries queries = JAXB.unmarshal(file, Queries.class); 

以上未經測試,但它應該給你一個想法。