XSD 验证:命名空间导致找不到根元素

XSD Validation : Namespace causing root element to not be found

我正在尝试更新现有架构以使用其自己的命名空间,这样我可以稍后将其导入另一个架构并明确说明所使用的类型来自导入的架构。

我尝试更改默认命名空间和目标命名空间,但这导致架构验证中断并隐藏了根节点。据我所知,我已将我的根元素隐藏在另一个命名空间中,但我不确定如何配置它以获得我想要的结果。

这是我尝试过的一个基本示例

XML

<Parent Id="P">
   <Child Id="C"/>
</Parent>

XSD

<xsd:schema targetNamespace="http://myNameSpace.com" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns="http://myNameSpace.com" 
            elementFormDefault="qualified" >

   <xsd:element name="Child">
      <xsd:complexType>
         <xsd:attribute name="Id" />
      </xsd:complexType>
   </xsd:element>


   <xsd:element name="Parent">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element ref="Child" minOccurs="0"/>
         </xsd:sequence>
         <xsd:attribute name="Id" />
      </xsd:complexType>
   </xsd:element>

</xsd:schema>

验证

Not valid.

Error - Line 1, 19: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 19; cvc-elt.1: Cannot find the declaration of element 'Parent'.

当您在 XSD 中有命名空间时,您必须在 XML 中也有它。

因此,您的 XML 必须如下所示:

<Parent Id="P" xmlns="http://myNameSpace.com">
    <Child Id="C"/>
</Parent>

或者如果您想使用前缀:

<mysp:Parent Id="P" xmlns:mysp="http://myNameSpace.com">
    <mysp:Child Id="C"/>
</mysp:Parent>

您需要对 XML 进行一些更改:

  • 实际将根元素放在目标给定的命名空间中 XSD 的命名空间,方法是将 xmlns="http://myNameSpace.com" 添加到 P.
  • 可选择使用 xsi:schemaLocation 向 XSD 提供提示 使用。

还有你的XSD:

  • 定义命名空间前缀并使用它来引用 Child 来自 Parent 声明的声明。

总而言之,这个XML,

<?xml version="1.0" encoding="UTF-8"?>
<Parent Id="P"
        xmlns="http://myNameSpace.com"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://myNameSpace.com try.xsd">
   <Child Id="C"/>
</Parent>

将对 XSD,

有效
<xsd:schema targetNamespace="http://myNameSpace.com" 
            xmlns:m="http://myNameSpace.com"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            elementFormDefault="qualified" >

  <xsd:element name="Child">
    <xsd:complexType>
      <xsd:attribute name="Id" />
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="Parent">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="m:Child" minOccurs="0"/>
      </xsd:sequence>
      <xsd:attribute name="Id" />
    </xsd:complexType>
  </xsd:element>

</xsd:schema>

根据要求。