【问题标题】:XML schema validation length of a string字符串的 XML 模式验证长度
【发布时间】: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>&#x1f600;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 警告警告的内容:感知到的“字符串长度”,即 显示为1 个字形,表示为 2 个 Unicode 字符 (0x6d 0x302),但可能需要例如3 个字节 用于存储(UTF-8:0x6D 0xCC 0x82),那么长度是 1、2 还是 3? maxLength定义对于字符串值是明确的:长度为 2,即 Unicode 字符数,不包括代理项对。

标签: java python-3.x xml unicode


【解决方案1】:

maxLength 的正确语义是它适用于 Unicode 字符(代码点)的数量,而不适用于字符串的任何特定编码中的八位字节(或 16 位代码单元)的数量。

是否所有的模式验证器实际上都符合这个定义,我不能说。但定义很明确。

顺便说一下,您的示例使用 Saxon 模式验证器验证得很好。

【讨论】:

猜你喜欢
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
相关资源
最近更新 更多