文档开头的XML注释
我的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环境,执行上面的这段小代码。第一次运行时不会有任何输出,但删除注释后就会显示出节点!
4 个回答
1
为了得到更好的回答,请给我们看一下(a)一个小的完整的Python脚本,以及(b)一个小的完整的XML文档,这样我们才能一起看到你遇到的意外情况。
你有没有考虑过使用ElementTree这个工具呢?
1
这是合法的;根据XML 1.0的参考资料:
2.5 注释
[定义:注释可以出现在文档的任何地方,只要不在其他标记中;此外,它们也可以出现在文档类型声明中,只要符合语法的要求。注释不是文档字符数据的一部分;一个XML处理器可以,也可以不允许应用程序获取注释的文本。为了兼容性,字符串“ -- ”(双连字符)在注释中是绝对不能出现的。] 参数实体引用在注释中是不能被识别的。
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,这个工具用起来要简单得多。:)