【问题标题】:Can XML comments go anywhere?XML 注释可以去任何地方吗?
【发布时间】:2010-09-08 05:26:50
【问题描述】:

我编写了一个简单的工具来使用用户输入的查询生成 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 了解我的测试结果。

【问题讨论】:

    标签: xml comments


    【解决方案1】:

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

    document ::= prolog element Misc*

    prolog 在哪里

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

    Misc

    Misc ::= Comment | PI | S

    XMLDecl ::= '&lt;?xml' VersionInfo EncodingDecl? SDDecl? S? '?&gt;'

    这意味着,如果你想在顶部有 cmets,你不能有一个 XML 类型声明。

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

    该规范与 Wikipedia 关于 cmets 一致:

    2.5 条评论

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

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

    然而,虽然理论上理论与实践一致,但在实践中却并非如此,所以我很想看看你的实验结果如何。

    【讨论】:

    • 前 3 个块引用是用什么符号写的?
    • 正确,尽管说 XML 声明只能作为 XML 文档的第一部分存在(甚至前面不能有一个空格)可能更简单。 cmets 不能在前面是一个结果,类似于在 XML 声明之前不允许处理指令,但允许在文档内的任何位置。
    【解决方案2】:

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

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

    纠正你的第一个例子:

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

    【讨论】:

    • “cmets 可以去其他任何地方”意味着 cmets 可以进入标记标签内。但是,我相信 cmets 不能进入标记标签内。
    【解决方案3】:

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

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

    【讨论】:

    • 从技术上讲,这不是处理指令,而是 XML 声明。这在 XML 规范中有明确规定。它恰好看起来像处理指令;但无效,因为 PI 不允许以“xml”开头的目标名称。但是,是的,必须先声明,不能有任何前面的字符。
    【解决方案4】:

    感谢大家的回答!

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2013-12-05
      • 1970-01-01
      • 2018-10-28
      • 2010-10-01
      • 2010-11-03
      • 1970-01-01
      相关资源
      最近更新 更多