2009-12-29 63 views
4

我想要做到这一点:我有一个XML文件,我想根据XSD文件进行验证。 到目前为止,上帝......我所要做的就是呈现所有节点的验证错误。介绍XML验证错误

例如,我有这个XML文件:

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

当我确认这个文件,这将让你在电话节点错误。 我想将该名称呈现给我的应用程序的最终用户,以及XML中的错误。

我triyng在C#.NET中做到这一点。

感谢您的帮助...

+0

你可以发布xsd文件吗? – Numenor 2009-12-29 14:31:49

+0

有趣的问题。你有没有找到高级别的解决方案?在没有用线和位置解释错误位置的意义上。谢谢 – robob 2012-06-20 13:43:19

回答

2

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

+0

是的。我能够使用.NET 3.5。你能举个例子吗? – 2009-12-29 14:15:37

+0

@arpf:目前还没有,不 - 但它应该是不言而喻的。试一试,如果你有问题,用你试过的代码编辑你的问题。 – 2009-12-29 14:49:40

+0

如何使用行号读取XML文档? – 2009-12-29 15:01:06

1

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

0

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

3

此代码根据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)); 
} 
+0

thanx,这真的帮了我很多,虽然我使用了[使用](http://msdn.microsoft.com/en-us/library/yh598w02.aspx)作为XmlReader的创建者。 – Natrium 2011-12-22 10:12:55

+0

那么DTD呢?我不认为我可以使用document.Validate来验证具有DTD验证设置的事件处理程序吗? – 2017-04-24 22:36:30