在XML中存储引用数据的可接受方式是什么?

时间:2008-09-29 20:09:14

标签: xml quotes

以XML格式存储引用数据的可接受方式是什么?

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

  • (a)< name> Jesse“The Body”Ventura< / name>
  • (b)< name> Jesse \“The Body \”Ventura< / name>
  • (c)< name> Jesse& quot; The Body& quot;文< /名称>
  • (d)以上都不是(请注明)

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

7 个答案:

答案 0 :(得分:28)

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

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

在讨论属性时,还要注意属性值中的'",具体取决于用于包围值的符号类型。

我发现经常编码"'在所有方面都是一个更好的主意,因为它有时会转换为其他格式,"或{{1也可能在那里引起问题。

答案 1 :(得分:14)

XML元素中的字符数据可以包含引号字符而不会转义它们。 XML元素中唯一不允许的字符是'&lt;','&amp;'和'&gt;' (并且只有“&gt;”字符属于“]]&gt;”字符序列的一部分时才会被禁止。

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

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

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

就'卷曲引号'而言,如果你在讨论Word有时会将引号转换为特殊的非ASCII引号 - 它们在XML中没有特殊含义,所以你可以做任何一个(但是它们)不能用来包含属性值“。你还需要确保文档的字符编码是正确的,这样才能正确解释它们。

答案 2 :(得分:5)

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

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

你应该在所有情况下避免(b)。从不通过字符串操作创建XML;总是使用DOM或其​​他工具。

答案 3 :(得分:4)

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

答案 4 :(得分:4)

  

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

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

在文本节点中,您只需要转义解析器将其解释为启动另一个节点的字符 - 因此您将&amp; &lt; 转义为&amp; amp; &amp; lt;

为了便于移植,转义卷引号通常是一个好主意,但没有理由在XML文本中转义普通引号。

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

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

通常更容易养成只使用一种类型并始终逃避它的习惯。我写了很多XSLT,并赞成使用“outside and”inside:

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

如果你因逃避而变得偏执,那么XPath的可读性就会降低:

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

如果(c),是否真的适合混合使用HTML&amp; XML?

XML定义命名实体 amp gt lt ,&amp; QUOT

HTML定义了更多实体。

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

lt 实体转义&lt; ,应该在文本和属性值中使用。 amp 实体转义&amp; ,应在文本和属性值中使用。 实体将转义',并应在属性值中使用。 gt 实体有点无用 - 在XML中几乎不需要转义&gt; 的语法要求。也许&gt;只同意与&lt;如果它有相同的账单。

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

更有用
  

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

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

答案 5 :(得分:0)

正确的答案是'C'。

单引号并不会导致问题,但您需要注意&符号和左尖括号。

答案 6 :(得分:0)

这完全取决于。如果您想要做的只是在XML字符串中有引号,那么'A'。

但是如果有意义或者你需要抽象引用(例如i18n),那么XML提供了更丰富的选择。例如:

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

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