我创建了以下XSD(使用Eclipse):
<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.example.com" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.example.com">
<element name="Make">
<complexType>
<sequence>
<element name="Scope"></element>
</sequence>
</complexType>
</element>
</schema>
并使用这个简单的XML验证
<?xml version="1.0"?>
<Make xmlns="http://www.example.com">
<Scope>
</Scope>
</Make>
给出:
xmllint.exe --noout --schema sources.xsd sources.xml
sources.xml:3: element Scope: Schemas validity error : Element '{http://www.example.com}Scope': This element is not expected. Expected is ( Scope ).
sources.xml fails to validate
在我看来,必须是正确的:XML文件位于命名空间http://www.example.com中(验证者也说了)。
对于XSD,我将默认命名空间设置为XSD架构(这是Eclipse所做的,所以它应该是正确的!)并且我给出了正确的targetNamespace。我也尝试过使用
<element name="tnd:Scope" />
然而,这也不起作用。
这是xmllint中的错误还是问题出在哪里?
此致 DIVB
答案 0 :(得分:4)
@dbasemans 答案的替代方法是将elementFormDefault
指定为合格:
<schema targetNamespace="http://www.example.com"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.example.com"
elementFormDefault="qualified">
使用架构命名空间的xsd
或xs
前缀可能会被视为常见,因此可能需要根据 dbaseman 的建议选择修改架构。
答案 1 :(得分:2)
如果您不想在要验证的XML文件中指定任何限定符,则必须将 targetNamespace 和根XSD名称空间都设置为相同的值。所以它必须是:
<schema targetNamespace="http://www.example.com" xmlns="http://www.example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
但当然,你必须使用xsd:来限定XSD元素。换句话说,要让您的XML文件按原样验证,您需要编写如下模式:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.example.com">
<xsd:element name="Make">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Scope"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
有关详细信息,请参阅此处:http://www.xfront.com/DefaultNamespace.pdf
编辑感谢PetruGardea指出错误。正如Filbert的回答所暗示的那样,默认情况下 elementFormDefault 是 unqualified ,这意味着假定实例文档位于目标命名空间中。所以Filbert的答案是正确的 - 唯一的选择是通过省略 targetNamespace 并将 elementFormDefault 保留为 unqualified 来使整个事件匿名,并且然后完全从实例文档中删除名称空间引用。
以下是 elementFormDefault 的详细信息:http://www.xfront.com/HideVersusExpose.html
答案 2 :(得分:1)
如果您不能或不想更改XSD,我找到了此问题的另一种解决方案。以下XML符合您的XSD:
<?xml version="1.0"?>
<tns:Make xmlns:tns="http://www.example.com">
<Scope>
</Scope>
</tns:Make>
如果elementFormDefault
设置为非限定,则必须为全局元素定义名称空间,并且不能为本地元素定义名称空间。全局元素是XSD中架构元素正下方的元素,局部元素是嵌套在其他元素中的元素。您的错误是由使用默认命名空间定义本地元素Scope的命名空间引起的。
http://www.oracle.com/technetwork/articles/srivastava-namespaces-092580.html还有进一步的解释。