【问题标题】:find xml files that contain milti line pattern查找包含 milti 行模式的 xml 文件
【发布时间】:2013-02-04 17:23:54
【问题描述】:

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

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

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

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

我正在尝试编写一个 Unix 脚本来实现这一点,方法是搜索给定目录中的每个文件并返回与该模式匹配的文件列表。我一直在寻找一种使用 sed 的方法,但我似乎无法找到解决这个特定问题的方法。此外,xml 文件是多行文件,如上所示。感谢你们提供的任何帮助!

【问题讨论】:

  • 考虑使用 xpath、xml 模式来完成这项工作。如果你更喜欢unix/linux cmdline,有xmllint,xsltclient你可以考虑。
  • 为此使用 xml 工具,例如 XMLStarlet 而不是 grep 或 sed。

标签: xml sed


【解决方案1】:

您可以使用 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

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

【讨论】:

  • 非常感谢您的帮助。由于时间限制(经理不太高兴)和完全缺乏使用 SQL 工具的经验,我最终选择了另一条路线。但我一定会留着以后用,它看起来真的很有趣。
猜你喜欢
  • 2018-02-11
  • 2017-10-27
  • 2023-01-30
  • 2019-09-25
  • 1970-01-01
  • 2013-12-25
  • 2022-01-11
  • 1970-01-01
  • 2010-12-17
相关资源
最近更新 更多