问题 XML评论可以随处发生吗?


我编写了一个简单的工具,使用用户输入的查询生成DBUnit XML数据集。我想将在XML中输入的每个查询作为注释包含在内,但是用于生成XML文件的DBUnit API不支持在我想要的地方插入注释(在它生成的数据之上),所以我求助于在顶部或底部对所有查询进行评论。

所以我的问题是:将它放在任何一个位置都是有效的XML吗?例如,在XML声明之上:

<!-- Queries used: ... -->
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  ...
</dataset>

或在根节点下面:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  ...
</dataset>
<!-- Queries used: ... -->

我计划最初尝试在XML声明之上,但我怀疑这是否是有效的XML,尽管声称来自 维基百科

注释可以放在树中的任何位置,包括在文本中,如果元素的内容是文本或#PCDATA。

我打算发布回来,如果这有效,但很高兴知道它是否是官方的XML标准。

更新: 看到 我的回复如下 为了我的测试结果。


11442
2017-09-08 22:14


起源



答案:


根据 XML规范,格式良好的XML文档是:

document ::= prolog element Misc*

哪里 prolog 是

prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?

XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'

这意味着,如果您希望在顶部有注释,则不能使用XML类型声明。

该规范与维基百科的评论一致:

2.5评论

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

所有这一切意味着您可以发表评论 任何不在其他标记内的地方,除了你 如果您带有评论,则不能拥有XML声明

然而,虽然在理论上理论与实践一致,但在实践中却没有,所以我很想知道你的实验是如何运作的。


12
2017-09-08 22:19



在前三个区块引用的符号是什么? - Camilo Martin
EBNF。看到 w3.org/TR/2006/REC-xml-20060816/#sec-notation - Anonymoose
正确,尽管可能更简单地说明XML声明只能作为XML文档的第一件事(它之前甚至不能有一个空格)存在。之前的注释不是一个结果,类似于在XML声明之前不允许处理指令,但允许在文档内的任何位置。 - StaxMan


答案:


根据 XML规范,格式良好的XML文档是:

document ::= prolog element Misc*

哪里 prolog 是

prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?

XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'

这意味着,如果您希望在顶部有注释,则不能使用XML类型声明。

该规范与维基百科的评论一致:

2.5评论

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

所有这一切意味着您可以发表评论 任何不在其他标记内的地方,除了你 如果您带有评论,则不能拥有XML声明

然而,虽然在理论上理论与实践一致,但在实践中却没有,所以我很想知道你的实验是如何运作的。


12
2017-09-08 22:19



在前三个区块引用的符号是什么? - Camilo Martin
EBNF。看到 w3.org/TR/2006/REC-xml-20060816/#sec-notation - Anonymoose
正确,尽管可能更简单地说明XML声明只能作为XML文档的第一件事(它之前甚至不能有一个空格)存在。之前的注释不是一个结果,类似于在XML声明之前不允许处理指令,但允许在文档内的任何位置。 - StaxMan


第一个例子不是有效的XML,声明必须是XML文档中的第一件事。

但除此之外,评论还可以去其他地方。

纠正你的第一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Queries used: ... -->
<dataset>
</dataset>

2
2017-09-08 22:21



“评论可以去任何其他地方”意味着评论可以进入标记标签。但是,我认为评论不能进入标记标记。 - mpb


处理指令必须是XML内容中的第一件事(参见 XML评论 和 处理说明)。以下应该有效:

<?xml version='1.0' encoding='UTF-8'?>
<!-- Queries used: ... -->
<dataset>
  ...
</dataset>

1
2017-09-08 22:26



从技术上讲,这不是处理指令,而是XML声明。这在XML规范中明确规定。它碰巧看起来像处理指令;但是无效,因为PI不允许以'xml'开头的目标名称。但是,是的,声明必须首先出现,没有任何前面的字符。 - StaxMan


谢谢大家的答案!

事实证明,文件前面的注释似乎有效,但是当我深入研究DBUnit源时,这是因为关闭了验证。

我确实尝试过一个简单的文档加载:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("/path/to/file"));

因为XML声明不是第一件事(如其他人所指出的那样),因此失败并出现异常。

因此,虽然DBUnit可以工作,但我更喜欢使用有效的XML,所以我将注释移到了最后(因为DBUnit生成了XML声明,所以不能将注释放在它下面,即使我更喜欢..至少在事后没有修改XML的情况下,这将是更多的工作而不是它的价值。


1
2017-09-08 23:50