我的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并执行上面的这个小代码。一旦它什么都不输出,删除评论后它将显示节点!
答案 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声明在第一行,这应该是合法的。