【问题标题】:Comments in XML at beginning of document文档开头的 XML 注释
【发布时间】:2010-06-12 20:55:24
【问题描述】:

如果 xml 文件开头有如下注释,我的 PYTHON xml 解析器将失败:

<?xml version="1.0" encoding="utf-8"?>
<!-- Script version: "1"-->
<!-- Date: "07052010"-->
<component name="abc">
<pp>
    ....
</pp>
</component>

这样发表评论违法吗?

编辑:

它没有抛出错误,但 DOM 模块将失败并且无法识别子节点:

import xml.dom.minidom as dom
sub_tree = dom.parse('xyz.xml')
for component in sub_tree.firstChild.childNodes:
    print(component)

我无法访问子节点; sub_tree.firstChild.childNodes 返回一个空列表,但如果我删除这 2 个 cmets,我可以像往常一样遍历列表并读取子节点!

编辑:

伙计们,这个简单的例子很有效,足以弄清楚。启动你的 python shell 并执行上面的这个小代码。一旦它什么都不输出,并且在删除 cmets 后它会显示节点!

【问题讨论】:

  • 它们是合法的。 w3.org/TR/REC-xml/#sec-comments 并且您应该显示失败的代码,并且您应该阅读 SO 常见问题解答 stackoverflow.com/faq
  • 这是合法的 XML,但这并不意味着所有的 XML 解析器都会处理它。您正在使用什么解析器,返回了什么错误,如果可能,请发布您正在做什么的代码 sn-p。
  • &lt;ppe&gt; ... &lt;/pp&gt; -- 请不要凭记忆输入;给我们看一个实际的小文件。

标签: python xml parsing


【解决方案1】:

如果你这样做:

import xml.dom.minidom as dom
sub_tree = dom.parse('xyz.xml')
print sub_tree.children

你会看到你的问题是什么:

>>> print sub_tree.childNodes
[<DOM Comment node " Script ve...">, <DOM Comment node " Date: "07...">, <DOM Element: component at 0x7fecf88c>]

firstChild 显然会选择第一个孩子,这是一个评论并且没有任何自己的孩子。 您可以遍历子节点并跳过所有评论节点。

或者您可以放弃 DOM 模型并使用 ElementTree,这样使用起来会更好。 :)

【讨论】:

  • 另一个问题:有 3 个节点:2 个 cmets 和一个元素节点。但根元素在哪里?有效的 xml 文件只允许有一个根元素!还是解析器对 cme​​ts 的处理方式不同?我认为必须有 1 个父元素!
【解决方案2】:

这是合法的;从 XML 1.0 Reference:

2.5 条评论

[定义:可能出现评论 文档之外的任何地方 标记;此外,它们可能会出现 在文档类型声明中 在语法允许的地方。他们 不是文档的一部分 字符数据; XML 处理器可以, 但不必,使其成为可能 检索文本的应用程序 厘米。为了兼容性, 字符串“--”(双连字符)不得 发生在 cmets 内。] 参数 实体引用不得 在 cmets 中被识别。

【讨论】:

    【解决方案3】:

    为了获得更好的答案,请向我们展示 (a) 一个小的完整 Python 脚本和 (b) 一个小的完整 XML 文档,它们一起展示了意外行为。

    您考虑过使用 ElementTree 吗?

    【讨论】:

      【解决方案4】:

      只要 XML 声明在第一行就应该是合法的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 2020-12-30
        • 2015-02-01
        • 1970-01-01
        • 2019-12-02
        • 2010-09-05
        相关资源
        最近更新 更多