如何根据XSD架构nonamespacelocation验证XML c#

时间:2017-11-03 18:10:33

标签: c# xml xmldocument

我正在使用c#并尝试复制我之前在VB6中编写的一些功能。

应该很简单:我有包含此语句的XML文件: 的xsi:noNamespaceSchemaLocation = “架构\ mySchema.xsd”

我希望能够使用XMLDocument来解析和验证XML 针对上面引用的模式文件的文件。

我不应该单独提供路径和文件名,因为它们是 已包含在XML文件中。

如果可能,我不想使用XMLReader。

我之前的VB6代码可以执行此操作并生成相应的错误 如果模式文件不存在/无法找到,或者XML文件的内容未通过验证。

如何在C#中完成此操作?

1 个答案:

答案 0 :(得分:1)

好的,在上面的评论之后,这基本上就是我最终的结果 我不想使用XmlReader:

...    
xmlString = System.IO.File.ReadAllText("myXMLDoc.xml");
XmlReaderSettings settings = new XmlReaderSettings();
settings.CloseInput = true;
settings.ValidationEventHandler += ValidationHandler;
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings |
                       XmlSchemaValidationFlags.ProcessIdentityConstraints |
                       XmlSchemaValidationFlags.ProcessSchemaLocation |
                       XmlSchemaValidationFlags.ProcessInlineSchema;

StringReader r = new StringReader(xmlString);
XmlReader validatingReader = XmlReader.Create(r, settings);
XmlDoc = new XmlDocument();
XmlDoc.Load(validatingReader);
...

private static void ValidationHandler(object sender, ValidationEventArgs e)
{
  if (e.Severity == XmlSeverityType.Error || e.Severity == XmlSeverityType.Warning)
    {
      validationErr += "XML Parse Error Line: " +
                         e.Exception.LineNumber + " Position: " +
                         e.Exception.LinePosition + " Message: " +
                         e.Exception.Message + Environment.NewLine;
     }
}

同样,如果有最小化上述代码的方法,我会感谢一些建议。

我还没有考虑过XDocument作为XmlDocument的替代品。