XML文档开头的注释

时间:2010-06-11 10:07:32

标签: python xml parsing

我的PYTHON xml解析器失败,如果在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返回一个空列表,但是如果我删除这两个注释,我可以遍历列表并像往常一样读取子节点!

编辑:

伙计们,这个简单的例子很有用,足以弄明白。启动你的python shell并执行上面的这个小代码。一旦它什么都不输出,删除评论后它将显示节点!

4 个答案:

答案 0 :(得分:1)

这是合法的;来自XML 1.0 Reference

  

2.5评论

     

[定义:可能会出现评论   在其他文档之外的任何地方   标记;此外,它们可能会出现   在文档类型声明中   在语法允许的地方。他们   不属于文档的一部分   人物数据;一个XML处理器MAY,   但是不需要,让它成为可能   应用程序检索文本   评论。为了兼容性,   字符串“ - ”(双连字符)绝不可以   发生在评论中。]参数   实体引用绝不是   在评论中得到承认。

答案 1 :(得分:1)

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

您是否考虑过使用ElementTree?

答案 2 :(得分: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 :(得分:0)

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