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字符列表?
答案 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
)不在其中,无论出于何种原因(至少,某些语言在缩写中使用它来表示常用词,所以它对我而言,它看起来不像是“分隔符”。
看到您可以在标签名称中使用数字,连字符和句点,但不能作为第一个字符,这也很有趣。