1

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

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

这是我尝试过的基本示例

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;行号:1;列号:19;cvc-elt.1:找不到元素“父”的声明。

4

2 回答 2

1

您需要对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>

按照要求。

于 2016-12-19T19:21:31.443 回答
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>
于 2016-12-19T18:58:36.467 回答