【问题标题】:XSD Validation Error: cvc-complex-type.2.4.a: Invalid content was found starting with element 'first_name'. One of '{first_name}' is expected [duplicate]XSD 验证错误:cvc-complex-type.2.4.a:发现以元素“first_name”开头的无效内容。应有“{first_name}”之一[重复]
【发布时间】: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_namelast_name 元素与根 person 元素位于相同的 urn:person.com.test 命名空间中,而在 Xsitan 的版本中只有 person 元素在该命名空间中,名字和姓氏元素不在命名空间中。 Xsitan 的 XML 文档与您现有的架构兼容,如果您将 elementFormDefault="qualified" 添加到您的架构中,那么它将与您现有的 XML 兼容(但与 Xsitan 的不兼容)。

标签: xml validation xsd schema


【解决方案1】:

声明命名空间前缀xmlns:prefix="urn:person.com.test"

<?xml version="1.0"?>
<prefix:person  xmlns:prefix="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>
</prefix:person>

我已通过 XMLSpear 验证

【讨论】:

  • 那行得通 - 谢谢 - 但为什么呢?我原来的方式有什么问题?
  • @monojohnny 抱歉耽搁了。问题是默认情况下 elementFormDefault 是合格的,这表明来自目标命名空间的元素必须具有命名空间前缀。 See here
猜你喜欢
  • 2020-10-31
  • 2013-05-27
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 2011-07-07
  • 2019-01-26
相关资源
最近更新 更多