xml属性/标记中的unicode字符无效

时间:2017-04-06 14:42:39

标签: python xml unicode utf-8

xml属性(标签)中无效的unicode字符列表是什么?

如下面的python3代码所示:

import xml.etree.ElementTree as ET
from io import StringIO as sio

xml_dec = '<?xml version="1.1" encoding="UTF-8"?>'
unicode_text = '<root>textº</root>'
valid_unicode = '<标签 属性="值">文字</标签>'
invalid_unicode_attribute = '<tag attributeº="value">text</tag>'
invalid_unicode_tag = '<tagº>text</tagº>'

ET.parse(sio(xml_dec + unicode_text))
# works

ET.parse(sio(xml_dec + valid_unicode))
# works

ET.parse(sio(xml_dec + invalid_unicode_attribute))
# ParseError

ET.parse(sio(xml_dec + invalid_unicode_tag))
# ParseError

unicode字符º,即U+00BA,如果它在元素文本中,则可以解析,但不能在元素属性或标记中解析。另一方面,其他unicode字符(如中文字符)可以在元素属性和标记中进行解析。

我检查了https://validator.w3.org/check中的xml <?xml version="1.1" encoding="UTF-8"?><tagº>text</tagº>,它给出了错误:

  

第1行,第43列:属性中不允许使用字符“º”   规格清单

但是,在XML Recommendation 1.1, §2.2 Characters中,它表示允许:

  

Char :: = [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] / *任何Unicode字符,不包括代理块,FFFE和FFFF。 * /

我的问题是,在哪里可以找到XML属性/标签中无效的unicode字符列表?

1 个答案:

答案 0 :(得分:2)

对于标记和属性名称中允许的字符,W3C recommendation(您自己链接到的 - 但您正在查看可在文本节点中使用的内容的定义)指出以下内容:

  

几乎所有字符都在名称中被允许,除了那些可以或者可以合理地用作分隔符的字符。

  

鼓励文档作者使用自然语言中有意义的单词或单词组合的名称,并避免名称中的符号或空白字符。请注意,明确允许使用COLON,HYPHEN-MINUS,FULL STOP(句点),LOW LINE(下划线)和MIDDLE DOT。

     

ASCII符号和标点符号以及相当大的一组Unicode符号字符将从名称中排除,因为它们在XML文档外部使用XML名称的上下文中更有用作为分隔符。提供这个组可以为那些不能成为XML名称一部分的内容提供硬性保证。

接下来是formal definition,其中列出了许多Unicode范围:

NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] |
                  [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] |
                  [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] |
                  [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
                  [#x10000-#xEFFFF]
NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 |
                  [#x0300-#x036F] | [#x203F-#x2040]
Name          ::= NameStartChar (NameChar)*

男性序数指标 º#xBA)不在其中,无论出于何种原因(至少,某些语言在缩写中使用它来表示常用词,所以它对我而言,它看起来不像是“分隔符”。

看到您可以在标签名称中使用数字,连字符和句点,但不能作为第一个字符,这也很有趣。