20

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

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

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

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

4

7 回答 7

29

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

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

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

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

于 2008-09-29T20:14:16.323 回答
15

XML 元素内的字符数据可以包含引号字符而不转义它们。在 XML 元素中唯一不允许使用的字符是 '<'、'&' 和 '>'(并且 '>' 字符只有在它是 "]]>" 字符序列的一部分时才被允许使用。

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

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

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

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

于 2008-09-29T20:46:32.907 回答
5

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

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

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

于 2008-09-29T21:00:02.483 回答
4

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

于 2008-09-29T20:27:12.453 回答
4

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

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

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

为了可移植性,转义大引号通常是个好主意,但没有理由转义 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 的任何字符都是如此——花引号没有什么特别之处。

于 2008-09-29T21:23:54.267 回答
0

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

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

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

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

于 2008-09-29T20:39:20.397 回答
0

正确答案是“C”。

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

于 2008-09-29T20:12:37.653 回答