XmlSchemaValidationException:';B';元素未声明
本文关键字:未声明 元素 XmlSchemaValidationException | 更新日期: 2023-09-27 18:19:32
我正在使用XmlReader根据Xsd验证Xml。
当我验证这个xml 时
<?xml version="1.0" encoding="utf-8" ?>
<A><B>sdf</B></A>
针对这个模式:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="B" type="xs:string" />
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:element ref="B"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
验证正常。
但如果我添加名称空间:
<?xml version="1.0" encoding="utf-8" ?>
<A xmlns="myns"><B>sdf</B></A>
以及相应的模式:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns">
<xs:element name="B" type="xs:string" />
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:element ref="B"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我接受System.Xml.Schema.XmlSchemaValidationException:未声明"B"元素。为什么会发生这种情况?如何添加命名空间?
出现验证错误的原因是您的模式实际上是两个模式。您有两个根元素,A和B。根元素不能隐式用作类型。您需要告诉XSD您想要使用来自另一个架构的类型(使用导入),或者使这些类型成为架构的本地类型(使用complexType定义)。
示例:将B提取到它自己的模式中。它不能共享相同的命名空间:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns2">
<xs:element name="B" type="xs:string" />
</xs:schema>
然后你可以使用import:从你的A类型中引用B
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns" xmlns:myns2="myns2">
<xs:import namespace="myns2" />
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:element ref="myns2:B" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
这允许您拥有以下有效的XML实例:
<?xml version="1.0" encoding="utf-8" ?>
<A xmlns="myns">
<B xmlns="myns2">sdf</B>
</A>
您能够验证类型的非命名空间版本的原因是,为了使XML有效,有两件事需要正确:
- 格式良好的XML
- 必须符合任何引用的模式类型
在非命名空间的XML文件中,根据定义,没有对任何模式类型的引用,因此该文档是有效的XML。