2013-02-04 58 views
0

我想搜索大量的XML文件爲缺少特定的標籤,或文件milti線圖形的XML文件,其中該標籤內的值是0發現含有

基本上,每個XML文件有一個或多個LIBRARY標籤,嵌套在這些標籤中的是一個或多個SECTION標籤,其內部是一個或多個SHELF標籤。在SHELF標籤裏面,應該是是一個BOOK標籤,其整數值不爲零。

我需要找到文件,其中這本書值爲0或書丟失在哪裏,但只有在第一貨架每個部分的。因此,如果多個SECTION標籤嵌套在多個LIBRARY標籤中,我需要檢查每個SECTION中的第一個SHELF。

<LIBRARY> 
    <SECTION> 
     <SHELF> 
      <BOOK>10000</BOOK> 
     </SHELF> 
    </SECTION> 
</LIBRARY> 

我想寫一個Unix腳本通過搜索指定目錄下的每個文件,並返回與模式相匹配的文件列表來實現這一目標。我一直在尋找一種方法來與sed做到這一點,但我似乎無法找到解決這個特定問題的方法。另外,xml文件是多行文件,如上所示。謝謝你們提供的任何幫助!

+0

考慮使用xpath,xml架構來完成這項工作。如果您更喜歡unix/linux cmdline,則可以考慮xmllint,xsltclient。 – Kent

+0

爲此使用一個xml工具,例如[XMLStarlet](http://xmlstar.sourceforge.net/)而不是grep或sed。 –

回答

0

您可以使用XPath來檢查,如果存在沒有書上的第一擱板或0書:

exists(//LIBRARY/SECTION/SHELF[1][empty(BOOK) or BOOK = 0]) 

或更容易使用XPath 2閱讀,檢查每一個第一架,如果它有一個不是0本書:

not(every $shelf in //LIBRARY/SECTION/SHELF[1] satisfies $shelf/BOOK[. != 0]) 

現在您需要一個xml工具來將xpath應用到每個文件並列出匹配的文件。

Xidel可以直接做到這一點,打印文件名/ URL,如果XPath條件爲真:

xidel --quiet -e 'if (not(every $shelf in //LIBRARY/SECTION/SHELF[1] satisfies $shelf/BOOK[. != 0])) then $url else ""' *.xml 

(但如果你有幾千個文件,這可能是緩慢的,從來沒有這麼測試它很多)

+0

非常感謝您的幫助。由於時間限制(經理不太高興)以及完全缺乏SQL工具經驗,我最終選擇了不同的路線。但我肯定會在以後保存這個,看起來非常有趣。 –