0

我正在尝试在大量 xml 文件中搜索缺少特定标记或该标记内的值为 0 的文件。

基本上,每个 xml 文件都有一个或多个 LIBRARY 标签,并且嵌套在这些标签内的是一个或多个 SECTION 标签,而这些标签内是一个或多个 SHELF 标签。在 SHELF 标签内应该有一个 BOOK 标签,其整数值不为零。

我需要查找此 BOOK 值为 0 或缺少 BOOK 的文件,但在每个 SECTION 的第一个SHELF 中。因此,如果多个 LIBRARY 标签内嵌套了多个 SECTION 标签,我需要检查每个 SECTION 中的第一个 SHELF。

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

I am trying to write a Unix script to achieve this by searching each file in a given directory and returning a list of the files that match the pattern. I have been searching for a way to do it with sed, but I can't seem to find the solution to this particular problem. Also, the xml files are multi-line files, as shown above. Thank you guys for any help you can provide!

4

1 回答 1

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 应用于每个文件并列出匹配的文件。

如果 XPath 条件为真,我的Xidel可以直接打印文件名/url:

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

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

于 2013-02-04T17:39:58.570 回答