XmlDocument.Validate的替代品,用于再次验证XSD

时间:2019-02-13 13:39:22

标签: .net-core

我想知道是否有XmlDocument.Validate的替代品来针对XSD进行验证。

原因是所提供的有关异常(验证错误)的信息可能会更加详细。

例如,可能存在经过验证的元素的索引或路径,行号和位置,使用XmlDocument.Validate时为零。

1 个答案:

答案 0 :(得分:0)

已解析的文档不会保留任何源文本信息,就像已编译的程序不会保留任何源代码信息一样。为了获得该信息,必须在加载文档时对其进行验证。给定以下架构和xml字符串,从validation documentation复制:

string xsdMarkup =  
    @"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>  
       <xsd:element name='Root'>  
        <xsd:complexType>  
         <xsd:sequence>  
          <xsd:element name='Child1' minOccurs='1' maxOccurs='1'/>  
          <xsd:element name='Child2' minOccurs='1' maxOccurs='1'/>  
         </xsd:sequence>  
        </xsd:complexType>  
       </xsd:element>  
      </xsd:schema>";  
XmlSchemaSet schemas = new XmlSchemaSet();  
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));  

var xml=@"<Root>
  <Child1>content1</Child1>
  <Child3>content1</Child3>
</Root>";

以下代码:

void ValidationHandler(object o,ValidationEventArgs e)
{
    Console.WriteLine("{0}:{1} {2}", e.Exception.LineNumber,e.Exception.LinePosition,e.Message);  
}

XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas=schemas;
settings.ValidationEventHandler += ValidationHandler;
settings.ValidationFlags = settings.ValidationFlags |
                           XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationType = ValidationType.Schema;

XmlReader reader = XmlReader.Create(new StringReader(xml), settings);            

XmlDocument document = new XmlDocument();
document.Load(reader);

将打印:

  

3:8元素'Root'具有无效的子元素'Child3'。可能的元素列表:“ Child2”。

相同的代码也可以与XDocument一起使用:

var doc=XDocument.Load(reader);

将打印相同的错误。