找到包含多行模式的xml文件

时间:2013-02-04 17:23:55

标签: xml sed

我正在尝试在大量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文件是多行文件,如上所示。谢谢你们提供任何帮助!

1 个答案:

答案 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

(虽然如果你有几千个文件可能会很慢,但从来没有测试过这么多文件)