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

时间:2016-12-19 18:54:11

标签: xml xsd xsd-validation xml-validation xsd-1.0

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

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

以下是我尝试过的基本示例

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>

验证

  

无效。

     

错误 - 第1行,第19行:org.xml.sax.SAXParseException; lineNumber:1; columnNumber:19; cvc-elt.1:找不到元素的声明   '父'。

2 个答案:

答案 0 :(得分:1)

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

  • 实际上将根元素放在target指定的命名空间中 将xmlns="http://myNameSpace.com"添加到P
  • ,即可获得XSD的命名空间
  • 可选择使用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>
根据要求

答案 1 :(得分:0)

当您在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>