【问题标题】:How to validate XML against XSD schema nonamespacelocation c# [duplicate]如何针对 XSD 架构 nonamespacelocation c# [重复] 验证 XML
【发布时间】:2017-11-03 18:10:32
【问题描述】:

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

应该很简单:我有包含以下语句的 XML 文件: xsi:noNamespaceSchemaLocation="Schemas\mySchema.xsd"

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

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

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

我以前的 VB6 代码可以做到这一点,并会产生适当的错误 如果架构文件不存在/找不到,或者 XML 文件的内容验证失败。

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

【问题讨论】:

  • 为什么不想使用 XMLReader?
  • @Progman - 我在访问 XML 时需要使用 XMLDocument,所以我希望避免使用另一个 xml 对象。 XMLDocument 不能做我想做的事吗?
  • 使用 XmlReaderSettings
  • @wayneh - 我想避免使用 XMLReader -- 在内部加载 XmlDocument 时,无论如何都会使用 XmlReader。见msdn.microsoft.com/en-us/library/a8ta6tz4(v=vs.110).aspx。因此,如果您创建一个验证XmlReader,您可以同时加载和验证。那是你要的吗?还是要在加载后进行验证?
  • 您可以创建一个XmlReader,如this answer 所示,然后将其传递给XmlDocument.Load(XmlReader)XDocument.Load(XmlReader)

标签: c# xml xmldocument


【解决方案1】:

好的,在上面的 cmets 之后,这基本上就是我最终得到的结果,尽管 我不想使用 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 的替代品。

【讨论】:

  • 我建议使用StreamReader 直接从文件中读取而不是读入中间string。如果 XML 文件很大,则字符串最终可能会出现在 large object heap 中,并会导致内存使用或性能问题。
  • @dbc - 谢谢,但我的 xml 数据作为来自外部源的字符串输入到我的代码中 - 不会有文件。由于传入 xml 的性质,我怀疑它的大小永远不会超过 1 或 2mb。
猜你喜欢
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
相关资源
最近更新 更多