有什么区别(专注于前缀h:,c:,a:和默认):
<?xml version="1.0" encoding="UTF-8"?>
<xmlBoo xmlns="http://www.example.org/boo"
xmlns:c="http://www.example.org/customer"
xmlns:a="http://www.example.org/address"
xmlns:h="http://www.example.org/header">
<h:header>
<h:id>101</h:id>
</h:header>
<c:customer>
<c:id>1</c:id>
<c:name>John</c:name>
<a:address>
<a:street>Long street</a:street>
</a:address>
</c:customer>
<someBooSpecificField>Specific data in Boo</someBooSpecificField>
</xmlBoo>
和
<?xml version="1.0" encoding="UTF-8"?>
<xmlBoo xmlns="http://www.example.org/boo"
xmlns:c="http://www.example.org/customer"
xmlns:a="http://www.example.org/address"
xmlns:h="http://www.example.org/header">
<header>
<h:id>101</h:id>
</header>
<customer>
<c:id>1</c:id>
<c:name>John</c:name>
<address>
<a:street>Long street</a:street>
</address>
</customer>
<someBooSpecificField>Specific data in Boo</someBooSpecificField>
</xmlBoo>
我问,因为我已经通过JAXB实现了映射,并且marshaller创建了第一个xml。但是当我添加模式验证时,我得到了异常:
cvc-complex-type.2.4.a: Invalid content was found starting with element 'ns3:header'. One of '{"http://www.example.org/boo":header}' is expected.
看起来验证器期望(基于模式)第二个xml。
元素标题前应该是哪个前缀? 默认(与命名空间[http://www.example.org/boo]相关联)或 h:(与命名空间[http://www.example.org相关联] /报头])。
我认为整个元素标题与 h:完全连接,而不仅仅是像第二个例子中的子元素。什么是最佳实践,对此有何解释。
我的XML架构:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:h="http://www.example.org/header"
xmlns:c="http://www.example.org/customer"
targetNamespace="http://www.example.org/boo"
elementFormDefault="qualified">
<xsd:import namespace="http://www.example.org/header" schemaLocation="header.xsd"/>
<xsd:import namespace="http://www.example.org/customer" schemaLocation="customer.xsd"/>
<xsd:element name="xmlBoo">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="header" type="h:header"/>
<xsd:element name="customer" type="c:customer"/>
<xsd:element name="someBooSpecificField" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
等。 header.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/header"
elementFormDefault="qualified">
<xsd:complexType name="header">
<xsd:sequence>
<xsd:element name="id" type="xsd:long"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
答案 0 :(得分:2)
第二个XML示例是正确的,如架构验证所示。
我认为您将该类型的命名空间与该元素的命名空间混淆。这条线 &lt; xsd:element name =“header”type =“h:header”&gt; 在您的模式中,在默认命名空间中定义了一个名为“header”的元素,该元素在“http://www.example.org/header”命名空间中的类型为“header”。
考虑一下xml是如何看的 &lt; xsd:element name =“myHeader”type =“h:header”&gt;