XML验证错误:元素未声明。

16

我正在使用.NET构建一个Web服务,该服务将通过XML传递数据。我希望使用我定义的XSD验证传入请求中的XML。

以下是XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:complexType name="POSearch">
       <xs:sequence minOccurs="0" maxOccurs="10">
           <xs:element name="POID" type="xs:positiveInteger"/>
       </xs:sequence>
   </xs:complexType>
</xs:schema>

这是XML:

<POSearch>
   <POID>1</POID>
   <POID>2</POID>
</POSearch>

以下是 C# 中的验证代码:

static void Main(string[] args){
   XmlSchemaSet iSchemas = new XmlSchemaSet();
   iSchemas.Add(string.Empty, @"...xsd file location");

   XmlReaderSettings settings = new XmlReaderSettings();
   settings.ValidationType = ValidationType.Schema;
   settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
   settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
   settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
   settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
   settings.Schemas.Add(iSchemas);

   XmlReader reader = XmlReader.Create(@"...xml file location", settings);

   try {
      while(reader.Read())
       ;
   }
   catch(Exception ex) {
      Console.WriteLine(ex.Message);
   }
}

private static void ValidationCallBack(object sender, ValidationEventArgs args) {
     if(args.Severity == XmlSeverityType.Warning)
        Console.WriteLine("\tWarning: Matching schema not found.  No validation occurred." + args.Message);
     else
        Console.WriteLine("\tValidation error: " + args.Message);
  }

我觉得之前这个东西是好使的,但我不确定为什么现在它不行了。每次运行它都会出现以下异常消息:

验证错误:未声明“POSearch”元素。

我是否定义了我的XSD有误?我的验证代码是否有误?这些元素确实都在那里。任何指导我朝正确方向前进的帮助都将不胜感激。


这是我在 StackOverflow 上找到的唯一有效的解决方案,其他 10 个关于“验证错误:'x' 元素未声明”的问题都无效。 - Alper
2个回答

14

你已经声明了类型,但没有声明该类型的元素。

添加一个元素声明:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

   <xs:element name="POSearch" type="POSearch"/>

   <xs:complexType name="POSearch">
       <xs:sequence minOccurs="0" maxOccurs="10">
           <xs:element name="POID" type="xs:positiveInteger"/>
       </xs:sequence>
   </xs:complexType>
</xs:schema>

5

试试这个:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:complexType name="POSearch">
       <xs:sequence minOccurs="0" maxOccurs="10">
           <xs:element name="POID" type="xs:positiveInteger"/>
       </xs:sequence>
   </xs:complexType>
    <xs:element name="POSearch" type="POSearch"/>
</xs:schema>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接