2015-02-23 96 views
-1

我想從xml只拉「圖像」,但我得到一個錯誤,因爲第一對夫婦不包括「圖像」。xmllint匹配和提取值

<?xml version='1.0' encoding='utf-8'?> 
<document> 
    <job name="Job1"> 
     <type> 
      <description> 
      </description> 
     </type> 
    </job> 
    <job name="Job2"> 
     <type> 
      <description> 
      </description> 
     </type> 
    </job> 
    <job name="Job3"> 
     <type> 
      <description> 
       <image> 
        <png></png> 
       </image> 
      </description> 
     </type> 
    </job> 
</document> 

它如何跳過前兩個匹配第三個圖像標籤?

xmllint --xpath "//*[local-name()='document']/job/type/description/image/png/text()" file 
+0

什麼錯誤,*完全*?你的代碼應該已經完成​​你描述的內容。另外,爲什麼所有這些與'local-name'混淆?你有沒有向我們展示命名空間? – 2015-02-23 22:45:31

+0

@MathiasMüller,...雖然在給出的示例文檔中,'png'沒有子文本節點。 OP選擇不在其問題中提供的錯誤是「XPath設置爲空」。 – 2015-02-23 22:50:56

+0

XPath查詢在許多方面都起作用,就像SQL連接一樣 - 它已經*繼續查找所有規範對齊的元素,而不是放棄如果它啓動的第一個路徑不起作用。 – 2015-02-23 22:56:45

回答

3

如果我修改你的輸入文件只有一行,改變

<png></png> 

<png>Some text goes here</png> 

...那麼你的代碼工作完美地已經寫入。因此,該錯誤與沒有png的前幾個沒有任何關係。


提個醒,因爲你沒有任何名稱空間中定義你,你不需要惹local-name()可言。

xmllint --xpath "/document/job/type/description/image/png/text()" 

...的作品也是如此。

+0

我在命令 – programiss 2015-02-23 22:51:48

+0

中得到了沒有輸出......複製並粘貼了您在此輸入的確切輸入(與原始文件相反,您沒有向我們顯示),並更改了給定的一行? – 2015-02-23 22:53:09

+1

加1,規範路徑表達式也會用'/'替換'//'。 – 2015-02-23 22:53:32