17

我编写了一个简单的工具来使用用户输入的查询生成 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,尽管来自wikipedia的声明:

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

如果这可行,我计划回帖,但很高兴知道它是否是官方 XML 标准。

更新:有关我的测试结果,请参阅下面的回复。

4

4 回答 4

16

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

document ::= prolog element Misc*

prolog在哪里

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

并且Misc

Misc ::= Comment | PI | S

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

这意味着,如果您想在顶部添加注释,则不能有 XML 类型声明。

但是,您可以在声明之后和文档元素之外,在文档的顶部或底部添加注释,因为Misc*可以包含注释。

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

2.5 评论

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

所有这一切意味着您可以将注释放在不在其他标记内的任何位置,除非您以注释开头,则不能有 XML 声明

然而,虽然理论上理论与实践一致,但实际上却并非如此,所以我很想知道你的实验是如何进行的。

于 2008-09-08T22:19:32.740 回答
4

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

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

更正您的第一个示例:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Queries used: ... -->
<dataset>
</dataset>
于 2008-09-08T22:21:48.193 回答
2

处理指令必须是 XML 内容中的第一件事(请参阅XML 注释处理指令)。以下应该有效:

<?xml version='1.0' encoding='UTF-8'?>
<!-- Queries used: ... -->
<dataset>
  ...
</dataset>
于 2008-09-08T22:26:39.617 回答
2

谢谢大家的回答!

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

我确实通过以下方式尝试了一个简单的文档加载:

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

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

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

于 2008-09-08T23:50:55.000 回答