XSD和XML验证

时间:2019-01-31 11:31:22

标签: xml xsd

我在验证xml和xsd时遇到问题。我从xsd架构中收到此错误。

  

src-resolve.4.2:解决组件'urn:id'时出错。已检测到   'urn:id'在名称空间中   'urn:schemas-microsoft-com:xml-diffgram-v1',但其中的组件   命名空间不可从架构文档中引用   'virtual://server/schema.xsd'。如果这是不正确的名称空间,   可能需要更改“ urn:id”的前缀。如果这是   正确的名称空间,然后应在其中添加适当的“导入”标签   'virtual://server/schema.xsd'

在xml模式中,我也发现了此错误。

  

cvc-complex-type.2.4.d:发现无效内容,开头为   元素“ xs:schema”。目前尚无子元素。

这是我的xml文件

<?xml version="1.0" encoding="ISO-8859-1"?>

<AddCustomerNotesByExtIDResult>
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="Status">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="StatusCode" type="xs:int" minOccurs="0"/>
                <xs:element name="Description" type="xs:string" minOccurs="0"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <NewDataSet>
      <Status diffgr:id="Status1" msdata:rowOrder="0">
        <StatusCode>0</StatusCode>
        <Description>Customer Notes added successfully</Description>
      </Status>
    </NewDataSet>
  </diffgr:diffgram>
</AddCustomerNotesByExtIDResult>

这是我的xsd文件

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="NewDataSet">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Status">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:byte" name="StatusCode"/>
                  <xs:element type="xs:string" name="Description"/>
                </xs:sequence>
                <xs:attribute ref="urn:id" xmlns:urn="urn:schemas-microsoft-com:xml-diffgram-v1"/>
                <xs:attribute ref="urn:rowOrder" xmlns:urn="urn:schemas-microsoft-com:xml-msdata"/>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="AddCustomerNotesByExtIDResult">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="xs:schema"/>
            <xs:element ref="urn:diffgram" xmlns:urn="urn:schemas-microsoft-com:xml-diffgram-v1"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>

1 个答案:

答案 0 :(得分:0)

这都很奇怪。您似乎有两种模式的版本,一种嵌入在XML文档中,另一种是独立的。他们不一样!

我想我们应该忽略XML中嵌入的那个,因为没有证据表明它实际上已用于验证。

因此,您实际上是在验证AddCustomerNotesByExtIDResult元素,并且该架构表示该元素应具有以下内容模型:

                                            

它通过引用不同名称空间中的声明来定义两个元素(xs:schema和urn:diffgram)的内容,但是除非该名称空间的模式为使用xs:import声明导入。如果没有这样的xs:import,则架构是不完整且无效的。

另一个小发现:

<xs:attribute ref="urn:id" xmlns:urn="urn:schemas-microsoft-com:xml-diffgram-v1"/>
<xs:attribute ref="urn:rowOrder" xmlns:urn="urn:schemas-microsoft-com:xml-msdata"/>

现在,使用相同的名称空间前缀来引用两个属性声明来引用不同的名称空间是完全合法的,但是这是非常不合常规和令人困惑的,所有这些都会导致一个总体结论,那就是整个事情没有太多的结合了解所有含义。