【问题标题】:Presenting xml validation errors呈现 xml 验证错误
【发布时间】:2010-12-30 18:44:19
【问题描述】:

我正在尝试这样做:我有一个 XML 文件,我想根据 XSD 文件对其进行验证。 到目前为止,上帝......我要做的是显示验证错误所在的所有节点。

例如我有这个 XML 文件:

<people>
   <name>Jonh</name>
   <tel>91991919199191919</tel>
</people>

当我验证这个文件时,这将在 tel 节点中得到一个错误。 我想向我的应用程序的最终用户展示名称以及 XML 中的问题。

我正在尝试在 C#.NET 中执行此操作。

感谢您的帮助...

【问题讨论】:

  • 有趣的问题。您找到任何高级别的解决方案了吗?在没有用线和位置解释错误位置的意义上。谢谢

标签: c# xml validation xsd


【解决方案1】:

此代码根据 XSD 文件验证 XML 文件并返回带有行号的错误。

public static void ValidateXML(Stream stream)
{
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.Schemas.Add("", "yourXSDPath");
    settings.ValidationType = ValidationType.Schema;
    XmlReader reader = XmlReader.Create(stream, settings);
    XmlDocument document = new XmlDocument();
    document.Load(reader);
    ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
    document.Validate(eventHandler);
    reader.Close();
}

static void ValidationEventHandler(object sender, ValidationEventArgs e)
{}

try
{
    ValidateXML(yourXMLStream);
}

catch (XmlSchemaValidationException ex)
{
    Console.WriteLine(String.Format("Line {0}, position {1}: {2}", ex.Message, ex.LineNumber, ex.LinePosition));
}

【讨论】:

  • thanx,这真的帮助了我,尽管我使用 using 来创建 XmlReader。
  • 那么 DTD 呢?我认为我不能使用 document.Validate 来验证具有 DTD 验证设置的事件处理程序?
  • 典型的 XML 文件没有“行”。这确实限制了这个答案的有用性。
【解决方案2】:

您可以使用 .NET 3.5 吗?如果是这样,您可以在XDocument 上使用Validate 扩展方法并提供ValidationEventHandler。当验证失败时,将使用 ValidationEventArgs 调用您的处理程序,您可以使用它来查找错误的位置。

【讨论】:

  • 是的。我能够使用 .NET 3.5。可以举个例子吗?
  • @arpf:目前没有,没有 - 但它应该是不言自明的。试一试,如果您有问题,请使用您尝试过的代码编辑您的问题。
  • XML 文档没有行号;文本文件。要显示包含错误的行,您需要处理包含 XML 文档的文件(或流),例如打开文件并一次读取一行,直到找到包含错误的行。
  • @Robert: ValidationEventArgs 实际上包含一个 XmlSchemaException,它可能包含作为 LineNumber/LinePosition 属性的违规位置...所以很可能不需要手动完成所有操作.不能说我自己试过,但那将是第一个看的地方。
【解决方案3】:

验证错误通常以XmlSchemaException 出现 - 您可以捕获这些错误并使用 Message 属性将这些错误报告给用户。

【讨论】:

    【解决方案4】:

    看看 Schematron。它非常适合这种验证。 虽然您可以使用 Schema 进行验证,但 Schematron 只使用 XSL 并生成一个包含验证消息的 XML 文档,您可以使用户友好。

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 2013-06-19
      • 1970-01-01
      相关资源
      最近更新 更多