【问题标题】:What's the accepted way of storing quoted data in XML?在 XML 中存储引用数据的公认方式是什么?
【发布时间】:2017-01-25 14:26:44
【问题描述】:

在 XML 中存储引用数据的公认方式是什么?

例如,对于一个节点,哪个是正确的?

  • (a) 杰西“身体”文图拉
  • (b) 杰西“身体”文图拉
  • (c) 杰西“身体”文图拉
  • (d) 以上都不是(请注明)

如果(a),你对属性做了什么?如果 (c),混合 HTML 和 XML 真的合适吗?同样,你如何处理单引号和大引号?

【问题讨论】:

    标签: xml quotes


    【解决方案1】:

    您的正确答案是 A 和 C,因为 " 不是必须在元素数据中编码的字符。

    您应该始终使用 XML 编码字符,例如 ><&,以确保它们不在 CDATA 部分内时不会出现问题。这些是元素数据需要关注的关键项目。

    在谈论属性时,您还必须注意属性值内部的'",具体取决于您用于围绕值的符号类型。

    我发现经常编码 "' 在各个方面都是一个更好的主意,因为它有时有助于转换为其他格式,而 "' 也可能会导致问题.

    【讨论】:

      【解决方案2】:

      XML 元素内的字符数据可以包含引号字符而不转义它们。 XML 元素中唯一不允许使用的字符是“”(并且“>”字符仅在它是“]]>”字符序列的一部分时才被允许使用。

      这并不是说转义引号不是一个好主意 - 我只是说不转义引号是完全有效的 XML。请参阅 XML 规范中的第 2.4 节 - “字符数据和标记”。

      所以 (a) 和 (c) 都可以。

      就属性而言,属性值可以用单引号或双引号括起来,所以如果它包含一个或另一个,您可以使用相反的一个来将值括起来。如果它同时包含两者,那么您必须为一个或两个使用一个字符实体。

      就“弯引号”而言,如果您谈论的是 Word 有时会将引号转换为的特殊非 ASCII 引号 - 它们在 XML 中没有特殊含义,因此您可以任意选择(但它们不能用于包含属性值”。您还需要确保文档的字符编码正确,以便正确解释它们。

      【讨论】:

        【解决方案3】:

        文本节点中的双引号可以表示为双引号字符或" 实体。属性值中的双引号如果值用单引号分隔,则可以表示为双引号字符,反之亦然;否则,将它们转义为"

        仅当您 a) 在不支持 XML 的文本编辑器中编辑 XML 或 b) 通过字符串操作以编程方式创建 XML 时,这才是相关的。一般来说,除非您真的知道自己在做什么,或者至少有办法在编辑完成后检查 XML 的格式是否正确,否则您应该避免 (a)。

        并且在任何情况下都应避免 (b)。永远不要通过字符串操作创建 XML;始终使用 DOM 或其他工具。

        【讨论】:

          【解决方案4】:

          您不必担心事物在 XML 中的编码方式。您应该始终使用适当的库来生成 XML 文档。 XML 有太多的陷阱,无法自己解决。我已经看到大量无效的 XML 文档出现在我面前,因为有人认为他们可以自己生成正确的 XML,而无需使用库。目前使用的所有主要编程语言都有 XML 库。

          【讨论】:

            【解决方案5】:

            例如,对于一个节点,哪个是正确的?

            XML 规范本身不讨论节点(除了将 DTD 语法与有限自动机正则表达式进行比较时)。 DOM 节点可以是属性、元素、文本或任何其他节点类型。

            在文本节点内,您只需要转义解析器将解释为启动不同节点的字符 - 因此您将 & 转义为 &amp ;<

            为了可移植性,转义大引号通常是个好主意,但没有理由转义 XML 文本中的纯引号。

            在属性节点内,您必须像以前一样转义小于号和与号,以及用于分隔属性的引号。

            <foo attribute="'ok'" attribute2='"also-ok"' attribute3="&quot;needed&quot;"/>
            

            通常更容易养成只使用一种类型并总是逃避它的习惯。我写了相当多的 XSLT 并且喜欢使用“外部和内部”:

            <xsl:value-of select="person[@name = 'bob']"/>
            

            如果您对转义感到偏执,XPath 的可读性就会降低:

            <xsl:value-of select="person[@name = &apos;bob&apos;"/>
            

            如果 (c),混合 HTML 和 XML 真的合适吗?

            XML 定义了命名实体 ampgtltapos、&quot

            HTML 定义了更多的实体。

            您可以并且应该在 XML 中使用 XML 命名实体,而不是使用数字实体。

            lt 实体转义 并且应该在文本和属性值中使用。 amp 实体转义 & 并且应该在文本和属性值中使用。 aposquot 实体转义 '" 并且应该在属性值中使用。 gt 实体有点没用 - 在 XML 中转义 > 几乎没有语法要求。也许 > 只同意与

            我在 XSLT 中经常使用的另一个生成源代码的是 ,它插入了一个新行。 &nl; 会比 >

            更有用

            同样,你如何处理单引号和大引号?

            XML 旨在标记 Unicode 文本,而花引号在其中没有特殊含义。但是,用于 XML 文档的编码在野外被误解的情况并不少见。所以如果它在一个封闭的环境中并且可以保证生产者和消费者的 Unicode 编码正确,那么我就把它放在 XML 中。否则使用数字字符实体。代码点高于 127 的任何字符都是如此——花引号没有什么特别之处。

            【讨论】:

              【解决方案6】:

              正确答案是'C'。

              单引号并不会真正引起问题,但您需要注意与号和左尖括号。

              【讨论】:

                【解决方案7】:

                这真的取决于。如果您只想在 XML 字符串中加上引号,则使用“A”。

                但如果有含义或需要抽象引用(例如 i18n),XML 提供了更丰富的选项。例如:

                <name>
                  <given>Jesse</given>
                  <family>Ventura</family>
                  <nickName>the Body</nickName>
                </name>
                

                在许多情况下都矫枉过正。但是,如果您需要正确处理世界上许多不同的 - 并且经常不一致的 - 命名方案,我会考虑按照这些方式对您的名字进行编码。 XML 非常适合。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-05-04
                  • 2021-10-22
                  • 2011-06-07
                  • 1970-01-01
                  • 2013-07-22
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-07-11
                  相关资源
                  最近更新 更多