3

根据规范,字符 [#x10000-#xEFFFF] 在 XML 名称中是合法的。但是,W3 验证器说这个 XML 格式不正确:

<?xml version="1.0"?>
<>value</>

(属性的名称是 Unicode 字符#x10400)。一些浏览器,如 Firefox,也抱怨它(Chrome 显示 XML,IE 显示空白页面)。是工具错误还是 XML 格式不正确?

4

2 回答 2

2

是工具错误还是 XML 格式不正确?

它在最新的规范 XML 1.0 Fifth Edition 中形成了良好的格式。但在 2008 年以前的版本中,它的格式并不好。

最初的 XML 1.0 规范(从 1998 年开始)将名称字符集锁定为在当时的 Unicode 标准中定义为字母的字符。这不包括几年后才出现在 Unicode 3.1 中的那个。

XML 1.1 在名称中接受哪些字符方面要宽松得多(主要是因为这个原因,允许来自未来 Unicode 版本的字符),这是一件好事。然而 XML 1.1 从未真正流行起来,因此编辑决定将更新的、更宽松的 namechar 规则从那里向后移植到 1.0。这是有争议的,总的来说可能不是一件好事。

这意味着您可以在 XML 1.0 文档中使用名称,并且可以被已针对第五版更新的解析器子集使用(或者从未实现过严格的规则),或者您可以在 XML 1.1 文档中使用它们并且可以使用由一组不同的支持 XML 1.1 的解析器。

或者,更现实地,你可以完全避开那些完全依赖于格式良好的角色,并感到有些悲伤。

于 2016-08-12T20:27:27.427 回答
1

是的,XML 名称中允许使用补充字符。

您的 XML 格式正确,因为元素名称使用W3C XML Recommendation中的名称产生所允许的字符。

然而:

  • 通过 HTTP 从您那里获取文件的在线验证器必须注意字符编码。看来,当W3C 标记验证服务获取您的 XML 时,您的角色在编码洗牌中迷失了:

    警告文档缺少"charset"属性。"text/xml"

    您的 Web 浏览器 ( ) 发送的 HTTPContent-Type标头 ( )不包含参数,但它是 XML 子类型之一。text/xmlMozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"charset"Content-Typetext/*

    相关规范 ( RFC 3023 ) 为此类文档指定了一个强默认值, "us-ascii"因此我们将使用此值,而不管您可能在其他地方指出的任何编码。

    如果您想使用不同的编码,您应该安排让您的浏览器发送这个新的编码信息。

    尝试离线 XML 解析器。例如,我的基于 Xerces-J 的验证器正确地将您的 XML 识别为格式正确。

  • 请注意,并非NAME允许的所有字符都可以在NCNAME中使用。因此,尽管格式正确,但根据不允许使用此类名称的 XSD,使用此类字符的 XML 是无效的。

于 2016-08-12T15:40:28.247 回答