【问题标题】:How to verify whether a xml file is valid in sh or bash?如何验证xml文件在sh或bash中是否有效?
【发布时间】:2014-04-01 17:21:59
【问题描述】:

如何在 sh(最好)或 bash 中验证 XML 文件是否有效?

我有一个文件经常损坏,在我花时间调查根本问题时需要更换。

有没有用 sh 或 bash 执行此任务的简单方法?

【问题讨论】:

  • 您应该澄清您的意思是格式正确(正确的语法)还是有效性(针对模式)。这些是不同的东西。

标签: xml bash sh xmllint


【解决方案1】:

大多数解析器都附带可以从命令行运行的示例程序。运行其中一个验证文档。

有很多好工具。作为已经实现了其中几个,但更关心语言而不是您使用的特定工具的人,我拒绝推荐其中一个。如果您坚持要对所提出的问题做出回答,那就是“您不能在 sh 或 bash 本身中这样做……至少不能,除非您有足够的受虐狂尝试从头开始编写它,并且那么性能会很糟糕。”

【讨论】:

    【解决方案2】:

    不直接使用 bash,但 xmllint 相当广泛。

    xmllint --format "${xmlfile}"
    

    如果 XML 文件无效,这将以非零状态退出(提示:$? 在 bash 中为您获取最后一个命令的退出代码)。

    【讨论】:

    • 需要更多引号以确保文件名包含空格或全局字符的安全。
    • 这正是我几年前停止使用 zsh 的原因——每当我为 POSIX 超集 shell 编写代码时,它都会导致太多错误。
    【解决方案3】:

    XMLStarlet 有一个 validate 子命令。最简单的方法是检查格式是否正确:

    xmlstarlet val "$filename"
    

    根据 DTD 进行验证:

    xmlstarlet val -d "$dtd_filename" "$xml_filename"
    

    要针对 XSD 架构进行验证:

    xmlstarlet val -s "$xsd_filename" "$xml_filename"
    

    要针对 RelaxNG 架构进行验证:

    xmlstarlet val -r "$rng_filename" "$xml_filename"
    

    这不是 bash 内置的——bash 没有内置的 XML 解析器,没有它就无法执行验证——但它被广泛打包用于现代操作系统发行版。


    XMLStarlet 还具有用于从 XML 文件中提取信息、编辑 XML 文件等的子命令。如果您要从 shell 脚本中使用 XML,建议使用它。

    【讨论】:

    • xmlstarlet val -e -s "$xsd_filename" "$xml_filename" 判断哪一行出错
    【解决方案4】:

    如果您想验证 RelaxNG schema,它是 W3C XML 模式的替代语法,您可以使用 Libxml2 (xmllint),但它只支持 RelaxNG XML 语法。

    使用 Libxml2 针对 RelaxNG 架构验证 XML 文件

    xmllint --noout --relaxng schema.rng file.xml
    

    可以使用trang 将RelaxNG 模式从紧凑语法转换为XML 语法。但您也可以使用 Jing 来针对 RelaxNG XML 模式进行验证。

    在您的计算机上安装 jing 后,您可以像这样针对架构 schema.relaxng 验证文件 file.xml

    jing schema.rng file.xml
    

    要使用 RelaxNG 紧凑语法:

    jing -c schema.rnc file.xml
    

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 2018-11-15
      • 1970-01-01
      • 2021-03-11
      相关资源
      最近更新 更多