XML 属性中允许使用哪些字符?

Posted

技术标签:

【中文标题】XML 属性中允许使用哪些字符?【英文标题】:Which characters are permitted in XML attributes? 【发布时间】:2013-11-15 00:13:40 【问题描述】:

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

    和元素的文本内容一样吗? 或者它只是一个子集(不包括例如 \n)?

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

【问题讨论】:

看看AttributeAttValue 的作品,你应该有答案。 相关问题:Are line breaks in XML attribute values valid? 【参考方案1】:

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

AttValue       ::=      '"' ([^<&"] | Reference)* '"'
                     |  "'" ([^<&'] | Reference)* "'"

【讨论】:

【参考方案2】:

XML 属性允许 character data(又名 CDATA)。请参阅“字符串类型”下的formal definition of attribute types。

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

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

<elem attr="a
linebreak">

但是这样的换行符会在 XML 解析过程中被转换成一个空格。这称为attribute-value normalization。

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

通常,当您操作文档并保存它时,DOM API 会为您执行此操作。不幸的是there are non-compliant APIs 没有正确编码属性值中的换行符。这些 API 无法保留换行符。

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

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


为了完整起见:由于一个相当短视的 (IMHO) 决定,在 XML 源代码的属性中允许使用文字 &amp;gt; 字符。只有文字 &lt; 被禁止:

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

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

<elem attr="this &gt; that" />
<elem attr="this &lt; that" />

【讨论】:

感谢您的出色回答。关于 字符 - 我相信你有一个错字。根据规范,是允许的。 @Dušan 当然,我记错了。谢谢指点,已经解决了。【参考方案3】:

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

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

【讨论】:

换行符在编码形式时会被报告。这是因为字符实体扩展发生在规范化之后。 @Tomalak 我同意,但我认为这个问题是关于具体语法而不是抽象信息集。 这更像是一种“附加信息”类型的评论,而不是更正。 :)

以上是关于XML 属性中允许使用哪些字符?的主要内容,如果未能解决你的问题,请参考以下文章

在符合 UIApperance 的自定义类中允许哪些 Swift 属性类型?

音频输出单元的输入回调中允许哪些操作

cookie 中允许使用哪些字符?

iPhone 应用名称中允许使用哪些字符

Android 上的文件名中允许使用哪些字符?

在dbgrideh中允许选择多行,如何知道哪些行被选中