在 XML 中存储引用数据的公认方式是什么?
例如,对于一个节点,哪个是正确的?
- (a) <name>杰西“身体”文图拉</name>
- (b) <name>杰西\“身体\”文图拉</name>
- (c) <name>杰西“身体” 文图拉</name>
- (d) 以上都不是(请注明)
如果(a),你对属性做什么?如果 (c),混合 HTML 和 XML 真的合适吗?同样,您如何处理单引号和大引号?
您的正确答案是 A & C 因为"
不是必须在元素数据中编码的字符。
您应该始终使用 XML 编码字符,例如>
、<
,并&
确保如果它们不在 CDATA 部分内,您不会遇到问题。这些是元素数据需要关注的关键项目。
在谈论属性时,您还必须注意属性值'
和"
内部属性值,具体取决于您用于围绕值的符号类型。
我发现经常编码"
并且'
在各个方面都是一个更好的主意,因为它有时会在转换为其他格式时有所帮助,其中"
or'
也可能导致问题。
XML 元素内的字符数据可以包含引号字符而不转义它们。在 XML 元素中唯一不允许使用的字符是 '<'、'&' 和 '>'(并且 '>' 字符只有在它是 "]]>" 字符序列的一部分时才被允许使用。
这并不是说转义引号不是一个好主意——我只是说不转义引号是完全有效的 XML。请参阅 XML 规范中的第 2.4 节 - “字符数据和标记”。
所以(a)和(c)都可以。
就属性而言,属性值可以用单引号或双引号括起来,因此如果它包含一个或另一个,您可以使用相反的一个来括起该值。如果它包含两者,那么您将不得不为一个或两个使用一个字符实体。
就“弯引号”而言,如果您谈论的是 Word 有时会将引号转换为的特殊非 ASCII 引号 - 它们在 XML 中没有特殊含义,因此您可以做任何事情(但他们不能用于包含属性值”。您还需要确保文档的字符编码正确,以便正确解释它们。
文本节点中的双引号可以表示为双引号字符或"
实体。属性值中的双引号如果值用单引号分隔,则可以表示为双引号字符,反之亦然;否则,将它们作为"
仅当您 a) 在不支持 XML 的文本编辑器中编辑 XML 或 b) 通过字符串操作以编程方式创建 XML 时,这才有意义。一般来说,除非您真的知道自己在做什么,或者至少有办法在编辑完成后检查 XML 的格式是否正确,否则您应该避免 (a)。
在任何情况下,您都应该避免 (b)。永远不要通过字符串操作创建 XML;总是使用 DOM 或其他工具。
您不必担心事物在 XML 中的编码方式。您应该始终使用适当的库来生成 XML 文档。XML 有太多的陷阱,无法自己解决。我已经看到大量无效的 XML 文档出现在我面前,因为有人认为他们可以自己生成正确的 XML,而无需使用库。目前使用的所有主要编程语言都有 XML 库。
例如,对于一个节点,哪个是正确的?
XML 规范本身不讨论节点(除了将 DTD 语法与有限自动机正则表达式进行比较时)。DOM 节点可以是属性、元素、文本或任何其他节点类型。
在文本节点内,您只需要转义解析器将解释为启动不同节点的字符 - 因此您将&和<转义为& 和< .
为了可移植性,转义大引号通常是个好主意,但没有理由转义 XML 文本中的纯引号。
在属性节点内,您必须像以前一样转义小于号和与号,以及用于分隔属性的任何引号。
<foo attribute="'ok'" attribute2='"also-ok"' attribute3=""needed""/>
通常更容易养成只使用一种类型并总是逃避它的习惯。我写了很多 XSLT 并且喜欢在里面使用“外部”和“内部”:
<xsl:value-of select="person[@name = 'bob']"/>
如果您对转义感到偏执,则 XPath 的可读性会降低:
<xsl:value-of select="person[@name = 'bob'"/>
如果 (c),混合 HTML 和 XML 真的合适吗?
XML 定义命名实体amp、gt、lt、apos、 & quot
HTML 定义了更多的实体。
您可以而且应该在 XML 中使用 XML 命名实体,而不是使用数字实体。
lt实体转义<并且应该在文本和属性值中使用。amp实体转义&并且应该在文本和属性值中使用。apos和quot实体转义'和"并且应该在属性值中使用。gt实体有点没用 - 在 XML 中几乎没有语法要求转义>。也许 > 只同意与 < 如果它相等计费。
我在生成源代码的 XSLT 中经常使用的另一个是 它插入一个新行。&nl; 会比>更有用
同样,您如何处理单引号和大引号?
XML 旨在标记 Unicode 文本,而花引号在其中没有特殊含义。但是,用于 XML 文档的编码在野外被误解的情况并不少见。因此,如果它在一个封闭的环境中并且可以保证生产者和消费者的 Unicode 编码正确,那么我只需将它放在 XML 中。否则使用数字字符实体。代码点高于 127 的任何字符都是如此——花引号没有什么特别之处。
这真的取决于。如果您只想在 XML 字符串中加上引号,则使用“A”。
但是如果有含义或者您需要抽象引用(例如 i18n),XML 提供了更丰富的选项。例如:
<name>
<given>Jesse</given>
<family>Ventura</family>
<nickName>the Body</nickName>
</name>
在许多情况下矫枉过正。但是,如果您需要正确处理世界上许多不同且经常不一致的命名方案,我会考虑按照这些方式对您的名称进行编码。XML 非常适合这一点。
正确答案是“C”。
单引号并不会真正引起问题,但您需要注意与号和左尖括号。