当前位置: 首页 > 知识库问答 >
问题:

XMLLint和Xerces对XSD模式验证的不同结果?

韦欣德
2023-03-14

上下文:我试图找到一种方法来验证XSD和XML与XSD的对比,该方法可以自动集成到软件构建过程中。输入是文件,对于输出,退出代码或可靠的可调节控制台输出就足够了。我在Windows环境中操作。

作为XML和XSD输入,我以Wikipedia(文章“XML模式(W3C)”)中的一个例子为例。

作为工具,我选择尝试XMLLint和Xerces。

问题是,XMLLint和Xerces给出了不同的结果。

这就引出了我的问题:我还有哪些评估工具的选择?我应该如何决定选择哪个工具?

维基百科的XML数据示例,SimpleAddress.xml:

<?xml version="1.0" encoding="utf-8"?>
<Address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="SimpleAddress.xsd">
  <Recipient>Mr. Walter C. Brown</Recipient>
  <House>49</House>
  <Street>Featherstone Street</Street>
  <Town>LONDON</Town>
  <PostCode>EC1Y 8SY</PostCode>
  <Country>UK</Country>
</Address>

维基百科中的XSD模式示例SimpleAddress。xsd:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Address">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Recipient" type="xs:string" />
        <xs:element name="House" type="xs:string" />
        <xs:element name="Street" type="xs:string" />
        <xs:element name="Town" type="xs:string" />
        <xs:element name="County" type="xs:string" minOccurs="0" />
        <xs:element name="PostCode" type="xs:string" />
        <xs:element name="Country" minOccurs="0">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="IN" />
              <xs:enumeration value="DE" />
              <xs:enumeration value="ES" />
              <xs:enumeration value="UK" />
              <xs:enumeration value="US" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

首先我用XMLLint进行的测试:

$ xmllint.exe --noout --schema SimpleAddress.xsd SimpleAddress.xml
SimpleAddress.xml validates

$ xmllint.exe --noout --schema http://www.w3.org/2001/XMLSchema.xsd SimpleAddress.xsd
SimpleAddress.xsd validates

当我故意在要验证的文件中添加额外的属性或标签时,XMLLint也会给我有意义的错误结果。

使用XMLLint,我还尝试对W3C的XML模式定义本身进行验证:

$ xmllint.exe --noout --schema http://www.w3.org/2001/XMLSchema.xsd http://www.w3.org/2001/XMLSchema.xsd
http://www.w3.org/2001/XMLSchema.xsd validates

其次,我对Xerces的测试会产生很多警告和错误:

$ StdInParse.exe -n -s -f -v=always < SimpleAddress.xml
stdin: 1 ms (7 elems, 2 attrs, 19 spaces, 56 chars)

$ StdInParse.exe -n -s -f -v=always < SimpleAddress.xsd
Error at (file stdin, line 2, char 87): no declaration found for element 'xs:schema'
Error at (file stdin, line 2, char 87): attribute 'elementFormDefault' is not declared for element     'xs:schema'
Error at (file stdin, line 2, char 87): attribute '{http://www.w3.org/2000/xmlns/}xs' is not declared  for element 'xs:schema'
Error at (file stdin, line 3, char 30): no declaration found for element 'xs:element'
(…)

对于以下测试,我在SimpleAddress.xsd的开始标记中添加了“xmlns: xsi”和“xsi: SchemaPlace”属性:

<xs:schema 
  elementFormDefault="qualified" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://www.w3.org/2001/XMLSchema.xsd"
>

XMLLint产生相同的结果:

$ xmllint.exe --noout --schema http://www.w3.org/2001/XMLSchema.xsd SimpleAddress.xsd
SimpleAddress.xsd validates

Xerces会产生更多的警告和错误,现在也涉及W3C的文档:

$ StdInParse.exe -n -s -f -v=always < SimpleAddress.xsd
Warning at (file http://www.w3.org/2001/datatypes.dtd, line 99, char 7): attribute 'id' has already been declared for element 'xs:simpleType'
Warning at (file http://www.w3.org/2001/datatypes.dtd, line 122, char 7): attribute 'id' has already been declared for element 'xs:list'
Warning at (file http://www.w3.org/2001/datatypes.dtd, line 130, char 7): attribute 'id' has already been declared for element 'xs:union'
Warning at (file http://www.w3.org/2001/datatypes.dtd, line 140, char 20): attribute 'id' has already been declared for element 'xs:maxExclusive'
(…)
Error at (file stdin, line 15, char 68): unable to find validator for simple type of attribute 'maxOccurs'
Error at (file stdin, line 16, char 56): unable to find validator for simple type of attribute 'maxOccurs'
Error at (file stdin, line 17, char 50): unable to find validator for simple type of attribute 'maxOccurs'

总之,XMLLint似乎满足了我的需要,但它有一个主要缺点。它需要我将要验证的XSD文件指定为单独的参数,因为它似乎无法从XML输入文件中读取相应的xmlns属性。

另一方面,还有薛西斯。它似乎被广泛使用,并声称忠实于此类文档中使用的标准,但即使是关于W3C文档,也会产生许多错误和警告。所以,我在问自己,我是否正确使用了它?我希望它能够正常工作,因为它不需要我为XMLLint的必要额外参数找到解决方法。

共有1个答案

慕飞章
2023-03-14

您不应该根据W3C模式验证XMLSchema(http://www.w3.org/2001/XMLSchema.xsd)。相反,请根据您的XMLSchema验证“空”XML文档(仅根),以查看您的XMLSchema是否包含任何错误。

 类似资料:
  • 现在,我正在使用XSD进行XML验证。 由于我使用了SchemaFactory: 然后我尝试切换到apache xerces,得到这个错误(从导入xerces开始): 为什么在android studio中java.exe以值1退出

  • 问题内容: 我有一个XML文件,并且有一个XML模式。我想针对该架构验证文件,并检查其是否符合该架构。我正在使用python,但是如果python中没有这样有用的库,则可以使用任何语言。 我在这里最好的选择是什么?我会担心如何快速启动和运行它。 问题答案: 绝对可以。 使用预定义的架构定义,加载文件并捕获任何XML架构错误: 关于编码的注意事项 如果模式文件包含带有编码(例如)的xml标记,则上面

  • 我已经想出了如何使用PHP中的XSD模式验证XML文件,但是似乎处理是使用XSD版本1.0完成的。 对于我的情况,我需要将XSD文件视为版本1.1。这样做的主要原因是我想用: 注意,它只能在

  • 我有一个XML文件,其结构如下: XSD模式: 和可视化的XSL文件(学生tylesheet.xsl): 我目前正在学习一门关于XML的短期课程,任务是在XML文件中构建给定的XSD模式和一些示例记录,然后最终使用XSLT将内容可视化为超文本标记语言。其中一项任务指出,我需要使用“urn:学生”作为结构的默认命名空间。然而,当我这样做的时候,我不会在最终的可视化中收到数据。当我从XML文件中删除“

  • 我在验证xml和xsd时遇到问题。我从xsd模式中得到这个错误。 src解决方案。4.2:解析组件“urn:id”时出错。检测到“urn:id”位于命名空间“urn:schemas microsoft com:xml-diffgram-v1”中,但此命名空间中的组件无法从架构文档中引用virtual://server/schema.xsd。如果名称空间不正确,可能需要更改“urn:id”的前缀。如