我编写了一个简单的工具,使用用户输入的查询生成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标准会很好。
更新:有关测试结果,请参阅my response below。
答案 0 :(得分:12)
根据XML specification,格式良好的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声明。< / p>
然而,虽然理论上的理论与实践一致,但在实践中并没有,所以我很想知道你的实验是如何运作的。
答案 1 :(得分:3)
第一个例子不是有效的XML,声明必须是XML文档中的第一件事。
但除此之外,评论还可以去其他任何地方。
纠正你的第一个例子:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Queries used: ... -->
<dataset>
</dataset>
答案 2 :(得分:1)
处理指令必须是XML内容中的第一件事(请参阅XML comment和processing instructions)。以下应该有效:
<?xml version='1.0' encoding='UTF-8'?>
<!-- Queries used: ... -->
<dataset>
...
</dataset>
答案 3 :(得分:1)
感谢大家的答案!
事实证明,文件前面的注释似乎有效,但是当我深入研究DBUnit源代码时,这是因为验证已关闭。
我通过以下方式尝试了一个简单的文档加载:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("/path/to/file"));
并且由于XML声明不是第一件事(因为其他人指出的情况),因此失败并出现例外情况。
因此,虽然DBUnit可以工作,但我更喜欢使用有效的XML,所以我将注释移到了最后(因为DBUnit会生成XML声明,所以不能将注释放在它下面,即使我更喜欢那......至少在没有事后修改XML的情况下,这将是更多的工作而不是它的价值。)