我正在尝试更新现有架构以使用自己的命名空间,因此我可以稍后将其导入另一个架构,并明确表示所使用的类型来自导入的架构。
我尝试更改默认和目标命名空间,但它导致架构验证中断并隐藏根节点。从我可以看到我已经将我的根元素隐藏在另一个命名空间中,但我不确定如何配置它以获得我想要的结果。
以下是我尝试过的基本示例
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:找不到元素的声明 '父'。
答案 0 :(得分:1)
您需要对 XML 进行一些更改:
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>
根据要求。
答案 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>