XML文档开头的注释

4

如果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返回一个空列表,但是如果我删除这两个注释,我可以像往常一样循环遍历该列表并读取子节点!

编辑:

各位,这个简单的示例可以工作并足以弄清楚。启动您的python shell并执行上面的小代码。一旦它不输出任何内容,并且在删除注释后它将显示出节点!


2
它们是合法的。http://www.w3.org/TR/REC-xml/#sec-comments 你应该展示导致失败的代码,并阅读SO faq http://stackoverflow.com/faq - msw
3
这是合法的XML,但并不意味着所有XML解析器都能处理它。你使用的解析器是什么?返回了什么错误?如果可能的话,请发布你正在进行的代码片段。 - Tendayi Mawushe
请不要从记忆中输入; 请向我们展示一个实际的小文档。<ppe> ... </pp> - John Machin
4个回答

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个注释和一个元素节点。 但是根元素在哪里?有效的XML文件只允许有一个根元素!或者解析器是否以不同的方式处理注释? 我认为必须有1个父元素! - binaryguy
ElementTree 能够解析这样的 XML,但似乎不能保留它。 - haridsv

1

这是合法的;来自XML 1.0 参考文献

2.5 注释

[定义:注释可以出现在文档中除其他标记之外的任何位置;此外,它们可以出现在文档类型声明中允许的位置。它们不是文档的字符数据;XML处理器可以使应用程序检索注释文本,但不需要这样做。为了兼容性,“--”(双连字符)字符串必须不出现在注释中。] 参数实体引用不能在注释中被识别。


1
为了获得更好的答案,向我们展示(a)一个小而完整的Python脚本和(b)一个小而完整的XML文档,二者结合起来演示了意外行为。
您是否考虑使用ElementTree?

0

只要XML声明在第一行,那就是合法的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接