是否可以在 XML 属性中包含 HTML 文本或 CDATA?

新手上路,请多包涵

当我尝试将 HTML 文本或 CDATA 放入我的 XML 属性时,我的解析器不断收到“XML 解析器失败:未终止的属性”。有没有办法做到这一点,或者这是标准不允许的?

原文由 Boon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 450
2 个回答

如果属性不是标记化或枚举类型,则将其作为 CDATA 处理。有关如何处理属性的详细信息,请参阅 可扩展标记语言 (XML) 1.0(第五版)

3.3.1 属性类型

XML 属性类型分为三种:字符串类型、一组标记化类型和枚举类型。 string 类型可以将任何文字字符串作为值;标记化类型受到更多限制。在属性值按照 3.3.3 属性值规范化中的描述进行规范化之后,应用语法中注明的有效性约束。

 [54]  AttType       ::=    StringType | TokenizedType | EnumeratedType
[55]  StringType    ::=    'CDATA'
[56]  TokenizedType ::=    'ID' [VC: ID]
            [VC: One ID per Element Type]
            [VC: ID Attribute Default]
        | 'IDREF'      [VC: IDREF]
        | 'IDREFS'     [VC: IDREF]
        | 'ENTITY'     [VC: Entity Name]
        | 'ENTITIES'   [VC: Entity Name]
        | 'NMTOKEN'    [VC: Name Token]
        | 'NMTOKENS'   [VC: Name Token]

3.3.3 属性值规范化

在将属性值传递给应用程序或检查有效性之前,XML 处理器必须通过应用下面的算法或使用其他方法规范化属性值,以便传递给应用程序的值与生成的值相同通过算法。

  1. 2.11 行尾处理 中所述,所有换行符都必须在 #xA 的输入上进行规范化,因此该算法的其余部分以这种方式对规范化的文本进行操作。
  2. 从一个由空字符串组成的规范化值开始。
  3. 对于非规范化属性值中的每个字符、实体引用或字符引用,从第一个开始到最后一个,执行以下操作:
    • 对于字符引用,将引用的字符附加到规范化值。
    • 对于实体引用,递归地将此算法的第 3 步应用于实体的替换文本。
    • 对于空白字符(#x20、#xD、#xA、#x9),将空格字符 (#x20) 添加到规范化值。
    • 对于另一个字符,将该字符附加到规范化值。

如果属性类型不是 CDATA,那么 XML 处理器必须通过丢弃任何前导和尾随空格 (#x20) 字符,并用单个空格 (#x20) 替换空格 (#x20) 字符序列来进一步处理规范化属性值) 特点。

请注意,如果非规范化属性值包含对除空格 (#x20) 以外的空白字符的字符引用,则规范化值包含引用字符本身(#xD、#xA 或 #x9)。这与非规范化值包含空白字符(不是引用)的情况形成对比,后者在规范化值中被空格字符 (#x20) 替换,也与非规范化值包含实体引用的情况形成对比替换文本包含空白字符;在递归处理过程中,空白字符在规范化值中被替换为空格字符 (#x20)。

未读取声明的所有属性应该由非验证处理器处理,就好像已声明 CDATA 一样。

如果 属性值 包含对尚未读取声明的实体的 引用,则会出错。

原文由 Rich Seller 发布,翻译遵循 CC BY-SA 2.5 许可协议

不,表示 CDATA 部分 的标记不允许作为属性的值。

根据规范,这种禁止是间接的而不是直接的。规范规定属性值 不能有左尖括号。打开的尖括号和符号必须转义。因此您不能插入 CDATA 部分。呜呜呜。

CData 部分仅在元素的文本节点中时才被解释。

原文由 JMP 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题