2011-11-25 43 views
40

我試圖查詢由adium生成的xml文件。 xmlwf表示它的格式良好。通過使用xmllint的調試選項我得到以下內容:xmllint無法正確查詢xpath

$ xmllint --debug doc.xml 
DOCUMENT 
version=1.0 
encoding=UTF-8 
URL=doc.xml 
standalone=true 
    ELEMENT chat 
    default namespace href=http://purl.org/net/ulf/ns/0.4-02 
    ATTRIBUTE account 
     TEXT 
     [email protected] 
    ATTRIBUTE service 
     TEXT compact 
     content=MSN 
    TEXT compact 
     content= 
    ELEMENT event 
     ATTRIBUTE type 

一切似乎解析就好。然而,當我試圖查詢最簡單的東西時,我什麼也沒得到:

$ xmllint --xpath '/chat' doc.xml 
XPath set is empty 

發生了什麼?使用xpath運行完全相同的查詢會返回正確的結果(但結果之間不會換行)。我做錯了什麼或者xmllint只是不能正常工作?

這裏的XML較短,匿名版本,顯示了相同的行爲:

<?xml version="1.0" encoding="UTF-8" ?> 
<chat xmlns="http://purl.org/net/ulf/ns/0.4-02" account="[email protected]" service="MSN"> 
<event type="windowOpened" sender="[email protected]" time="2011-11-22T00:34:43-03:00"></event> 
<message sender="[email protected]" time="2011-11-22T00:34:43-03:00" alias="foo"><div><span style="color: #000000; font-family: Helvetica; font-size: 12pt;">hi</span></div></message> 
</chat> 
+0

可以請你分享doc.xml文件 – rpg

回答

67

我不使用xmllint,但我覺得你的XPath不工作的原因是因爲你的doc.xml文件正在使用默認名稱空間(http://purl.org/net/ulf/ns/0.4-02)。

從我所看到的,你有2個選項。

答:在shell模式下使用xmllint並使用前綴聲明命名空間。然後,您可以在XPath中使用該前綴。

xmllint --shell doc.xml 
    /> setns x=http://purl.org/net/ulf/ns/0.4-02 
    /> xpath /x:chat

B.使用local-name()匹配元素名稱。

xmllint --xpath /*[local-name()='chat']

你也可以使用具有local-name()沿namespace-uri()='http://purl.org/net/ulf/ns/0.4-02'所以你一定要回到你正打算返回什麼。

+2

注意例子A.和B.會失敗,如果你不訪問根路徑,在這種情況下你需要一個雙斜線,例如xmllint --xpath「// * [本地名稱()= '聊天']」。請參閱http://stackoverflow.com/questions/27311314/how-to-get-the-tag-yweathercondition-from-yahoo-weather-rss-with-xmllint?noredirect=1#comment43085213_27311314 –

+0

@ Avt'W - 此問題/ answer是專門針對xmllint中的命名空間的;沒有任何其他XPath主題。什麼'/'和'/'匹配是完全不相關的。 –

+5

嘿,這是一個讀者的評論,會有一個稍微不同的用例,而不是你的答案的批評者,它準確地回答了問題。有名字空間問題的人可能是新手,因此我認爲值得指出。 –