Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XML架构验证字符串的长度_Java_Python 3.x_Xml_Unicode - Fatal编程技术网

Java XML架构验证字符串的长度

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模式语言中的字符串意味着什么。我测试了两个不同的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>

😀;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
警告所警告的:“字符串长度”从用户的角度看,即
显示为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>