【发布时间】:2015-05-05 10:22:38
【问题描述】:
我构建了以下 ('Person.xsd') XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:person.com.test"
xmlns="urn:person.com.test">
<xs:element name="person" type="Person" />
<xs:complexType name="Person">
<xs:sequence>
<xs:element name="first_name" type="xs:string" />
<xs:element name="last_name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
还有以下 XML 文档('Person.xml'):
<?xml version="1.0"?>
<person
xmlns="urn:person.com.test"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:person.com.test person.xsd" >
<first_name>Joe</first_name>
<last_name>Bloggs</last_name>
</person>
但是当我验证 XML 时(我使用的是 Netbeans 8.x,但我尝试过的其他验证器给出了非常相似的结果);我收到以下无益的消息:
XML validation started.
Checking file:[...]/validator/src/main/resources/person.xml...
Referenced entity at "file:[...]/validator/src/main/resources/person.xsd".
cvc-complex-type.2.4.a: Invalid content was found starting with element 'first_name'. One of '{first_name}' is expected. [7]
XML validation finished.
编辑:原来我在这里对“目标命名空间”的含义和其他东西有一些误解。
接受的答案有效 - 但@Ian Roberts 指出(这实际上可能是另一篇帖子的真正副本)“first_name”和“last_name”是(“person”元素的子元素)仍然(出于某种原因)被认为根本不在命名空间中。
无论如何:我已经像这样通过 XML 和 XSD 进行了修改 - 这很有效 - 我相信(这是我需要的)元素现在都在 person.com.test 命名空间中:
<?xml version="1.0"?>
<p:person
xmlns:p="urn:person.com.test"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:person.com.test person.xsd" >
<p:first_name>Joe</p:first_name>
<p:last_name>Bloggs</p:last_name>
</p:person>
这实际上也有效:(原始 XML)
<person
xmlns="urn:person.com.test"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:person.com.test person.xsd" >
<first_name>Joe</first_name>
<last_name>Bloggs</last_name>
</person>
只要 XSD 中有 elementFormDefault="qualified" 指令。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:person.com.test"
xmlns="urn:person.com.test"
elementFormDefault="qualified">
<xs:element name="person" type="Person" />
<xs:complexType name="Person">
<xs:sequence>
<xs:element name="first_name" type="xs:string" />
<xs:element name="last_name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
【问题讨论】:
-
您是否检查过右侧链接的任何“相关”问题?其中有几个很好地解释了潜在的问题。
-
@Ian Roberts - 我看了很多现有的答案;但我没有找到一个与我的错误完全相同的错误。我已更正:实际上这个stackoverflow.com/questions/25532389/… 似乎是一样的——我错过了。谢谢。
-
问题是
complexType中的本地元素声明默认情况下不会采用targetNamespace,除非您将elementFormDefault="qualified"添加到架构中。 -
我没有改变它 - 并从下面的 Xsitan 回答中得到它。似乎我不得不为我正在使用的命名空间创建一个前缀,而不是(正如我认为的那样)将父命名空间(没有前缀)“切换”到同一个命名空间......我'不知道有什么区别......
-
不同之处在于,在问题的原始 XML 文档中,
first_name和last_name元素与根person元素位于相同的urn:person.com.test命名空间中,而在 Xsitan 的版本中只有person元素在该命名空间中,名字和姓氏元素不在命名空间中。 Xsitan 的 XML 文档与您现有的架构兼容,如果您将elementFormDefault="qualified"添加到您的架构中,那么它将与您现有的 XML 兼容(但与 Xsitan 的不兼容)。
标签: xml validation xsd schema