2012-01-06 61 views
4

我正在使用XmlReader来验证Xml是否针对Xsd。XmlSchemaValidationException:'B'元素未声明

当我验证此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' 元素未声明。 为什么会发生这种情况?我怎样才能添加一个名称空间?

回答

5

您得到验证错误的原因是您的模式实际上是两个模式。您有两个根元素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="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 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> 

然后,你可以通过使用进口从A型参考B

您能够验证非命名空间版本的类型的原因是因为为了成为有效的XML,两件事情必须是真实的:

  • 良好的XML
  • 必须符合任何引用的模式类型

在非namespace'd XML文件中,有定义的任何模式类型没有提及,所以因此文档是有效的XML。

+0

+1用于提示从模式A提取模式B.它帮助了我! :) – Learner 2012-07-05 11:53:04