2

W3c 的规范中,我似乎无法找到允许出现在 XML 文档的属性值中的字符集的定义。

  1. 它与元素的文本内容相同吗?
  2. 或者它只是一个子集(不包括例如\n)?

请引用规范中回答我的问题的部分。

4

3 回答 3

6

XML 属性允许字符数据(又名 CDATA)。请参阅“字符串类型”下的属性类型的正式定义。

从根本上说,必须在 XML 源(即,它会出现在文本编辑器中)和 DOM(即,它会存在于内存中,在解析 XML 源之后)之间有所区别。

\n属性可以在 XML 源中包含文字换行符 ( ),如下所示:

<elem attr="a
linebreak">

但是这样的换行符会在 XML 解析过程中被转换成空格。这称为属性值规范化

为了在解析获得换行符,必须在 XML 源中将其编码为&#xA;或等效的&#10;.

通常,当您操作文档并保存它时,DOM API 会为您执行此操作。不幸的是,有些不兼容的 API不能正确编码属性值中的换行符。这些 API 使保留换行符成为不可能。

制表符 ( ) 也会发生同样的情况\t。它可能存在于 XML 源代码中,但在解析时会被规范化为单个空格。为了防止它必须被编码,无论是作为&#x9;&#9;

底线:如果您通过 API 与 XML 文档进行交互(而且您应该这样做!),所有这些细节都会为您处理好,除非 API 被破坏。


为了完整起见:由于一个相当短视(恕我直言)的决定,>在 XML 源代码的属性中允许文字字符。<只禁止文字:

<elem attr="this > that" />  <!-- legal syntax -->
<elem attr="this < that" />  <!-- syntax error -->

我建议不要使用那个怪癖。&gt;无论如何,大多数 API 都会插入转义形式:

<elem attr="this &gt; that" />
<elem attr="this &lt; that" />
于 2013-11-04T11:28:31.943 回答
3

2.3 节定义了常见的句法结构。特别是有一个AttValue规则:

AttValue       ::=      '"' ([^<&"] | Reference)* '"'
                     |  "'" ([^<&'] | Reference)* "'"
于 2013-11-04T11:26:54.327 回答
2

http://www.w3.org/TR/xml/#NT-AttValue是您正在寻找的产品,本质上它表示属性值可以包含除小于号和与号之外的任何字符(除了有效字符或实体引用),或值周围使用的引号字符(单引号属性可以包含双引号,双引号属性可以包含单引号,反之亦然)。

正如 Tomalak 所说,换行符允许的,但解析器不会将它们报告为换行符。

于 2013-11-04T11:31:34.327 回答