我正在尝试在大量xml文件中搜索缺少特定标记的文件,或者该标记内的值为0的文件。
基本上,每个xml文件都有一个或多个LIBRARY标记,其中嵌套的是一个或多个SECTION标记,其中包含一个或多个SHELF标记。在SHELF标记内,应该是一个BOOK标记,其整数值不为零。
我需要找到此BOOK值为0或缺少BOOK的文件,但每个SECTION的第一个 SHELF中仅 。因此,如果有多个SECTION标签嵌套在多个LIBRARY标签中,我需要检查每个SECTION中的第一个SHELF。
<LIBRARY>
<SECTION>
<SHELF>
<BOOK>10000</BOOK>
</SHELF>
</SECTION>
</LIBRARY>
我正在尝试编写一个Unix脚本来实现这一点,方法是搜索给定目录中的每个文件并返回与该模式匹配的文件列表。我一直在寻找一种方法来使用sed,但我似乎找不到解决这个特殊问题的方法。此外,xml文件是多行文件,如上所示。谢谢你们提供任何帮助!
答案 0 :(得分:0)
如果存在没有书籍或0本书的第一个书架,您可以使用XPath进行检查:
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可以直接执行此操作,如果XPath条件为真,则打印文件名/ url:
xidel --quiet -e 'if (not(every $shelf in //LIBRARY/SECTION/SHELF[1] satisfies $shelf/BOOK[. != 0])) then $url else ""' *.xml
(虽然如果你有几千个文件可能会很慢,但从来没有测试过这么多文件)