Java XML架构验证字符串的长度
我很难理解长度限制对XML模式语言中的字符串意味着什么。我测试了两个不同的XMLSchema验证器实现,结果不一致。我使用以下模式和文件进行测试:Java XML架构验证字符串的长度,java,python-3.x,xml,unicode,Java,Python 3.x,Xml,Unicode,我很难理解长度限制对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:schemaL
<?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>
😀;xx
及
IDE pycharm在id元素的下面加了一个读取行,这是一个错误,它不符合模式。使用Python3执行的python代码表示XML文件符合模式。
我想知道XML文件的模式是否兼容。我想重点是,字符(不管这个词确切的意思是什么)是如何计数的:字符串的长度是unicode代码点的数量,utf16代理的数量,或者是图形的数量
实现(Python 3,使用了AFAIK UFT-32)和Java(UTF-16)是否可能泄漏到XMLSchema验证中
有什么建议吗
--迈克
顺便说一句:Java8内置模式处理器抱怨我的示例也不符合模式 maxLength的正确语义是,它适用于Unicode字符(代码点)的数量,而不是字符串任何特定编码中的八位字节(或16位代码单元)的数量 我不能说所有的模式验证器是否都符合这个定义。但定义是明确的
顺便说一句,您的示例使用Saxon模式验证器进行了很好的验证。“有没有可能实现(使用AFAIK UFT-32的Python 3)和Java(UTF-16)泄漏到XMLSchema验证中?”——是的,但这仅仅是因为验证器实现存在缺陷。XML专门将字符串定义为字符序列,将字符定义为Unicode代码点,专门排除代理项对()。这意味着计数
UTF-16
值的验证器有缺陷。但是,请阅读以下警告说明:注意:对于字符串和数据类型·派生·来自字符串,maxLength
并不总是与某些用户认为的“字符串长度”或某些数字表示中的存储单元数一致。因此,在为maxLength
指定一个值时,以及在试图从maxLength
的给定值推断存储需求时,应该小心。当然,字符的定义在Unicode中有点模糊。m̂,从用户的角度看是一个“字符”,它由两个代码点构成:0x6d 0x302。这正是maxLength
警告所警告的:“字符串长度”从用户的角度看,即m̂
显示为1个字形,表示为2个Unicode字符(0x6d 0x302
),但可能需要例如3个字节的存储空间(UTF-8:0x6D 0xCC 0x82
),那么长度是1、2还是3呢?maxLength
的定义对于字符串值来说是明确的:长度是2,即Unicode字符数,不包括代理项对。JDK 8内置验证程序做得不对。AFAIK pycharm是用Java构建的,因此计算UTF-16代理项,这显然是错误的。--Mik。
<?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>