【发布时间】:2020-01-20 07:05:05
【问题描述】:
我很难理解,长度限制对 XML 模式语言中的字符串意味着什么。我测试了两种不同的 XMLSchema 验证器实现并得到了不一致的结果。我使用以下架构和文件进行测试:
<?xml version="1.0" encoding="UTF-8"?>
<test xmlns="http://www.example.org/NewXMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/NewXMLSchema NewXMLSchema.xsd ">
<id>😀xx</id>
</test>
和
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/NewXMLSchema" xmlns:tns="http://www.example.org/NewXMLSchema" elementFormDefault="qualified">
<simpleType name="MyFixedString">
<restriction base="string">
<maxLength value="3"></maxLength>
</restriction>
</simpleType>
<complexType name="NewComplexType">
<sequence>
<element name="id" type="tns:MyFixedString"></element>
</sequence>
</complexType>
<element name="test" type="tns:NewComplexType"></element>
</schema>
IDE pycharm 在使用 read 行为 id 元素下划线时出错,表明它不符合模式。用 Python 3 执行的 Python 代码表明 XML 文件是模式兼容的。 我想知道 XML 文件是否符合模式。我认为关键是,如何计算字符(无论该术语的确切含义):字符串的长度是 unicode 代码点的数量或 utf16 代理的数量或字素的数量。
是否有可能实现(使用 AFAIK UFT-32 的 Python 3)和 Java (UTF-16) 泄漏到 XMLSchema 验证中?
有什么建议吗?
-- 米克
顺便说一句:Java 8 内置模式处理器抱怨我的示例也不符合模式。
【问题讨论】:
-
“是否有可能实现(Python 3,使用 AFAIK UFT-32)和 Java (UTF-16) 泄漏到 XMLSchema 验证中?” -- - 是的,但这只是因为验证器实现是有缺陷的。 XML 专门将字符串定义为字符序列,将字符定义为 Unicode 代码点,特别是不包括代理项对 (2.2 Characters)。这意味着计算
UTF-16值的验证器是有缺陷的。 -
但是,请阅读关于
maxLength的警告说明:注意: 对于字符串和数据类型·派生自字符串,maxLength不会总是与某些用户感知的“字符串长度”或某些数字表示中的存储单元数量一致。因此,在为maxLength指定值以及尝试从maxLength的给定值推断存储要求时应小心。 -
当然 char 的定义在 Unicode 中有点模糊。 m̂ ,从用户看来是一个“字符”,是由两个代码点构建的:0x6d 0x302。
-
这正是
maxLength警告警告的内容:感知到的“字符串长度”,即m̂显示为1 个字形,表示为 2 个 Unicode 字符 (0x6d 0x302),但可能需要例如3 个字节 用于存储(UTF-8:0x6D 0xCC 0x82),那么长度是 1、2 还是 3?maxLength的定义对于字符串值是明确的:长度为 2,即 Unicode 字符数,不包括代理项对。
标签: java python-3.x xml unicode