使用C#

时间:2017-01-20 13:04:22

标签: c# xml validation

我有一个需要验证的xml文件。我为行号添加了一个名为“Ln”的标签。当作为错误列表的一部分存在验证错误时,我正在尝试返回此行号。这是我的xml:

<employees>
    <employee>
        <firstName>John</firstName> <lastName>Doe</lastName><Ln>0</Ln>
    </employee>
    <employee>
        <firstName>Anna</firstName> <lastName>Smith</lastName><Ln>1</Ln>
    </employee>
    <employee>
        <firstName>Peter</firstName> <lastName>Jones</lastName><Ln>2</Ln>
    </employee>

</employees>

我使用以下代码对其进行验证:

System.Xml.Schema.XmlSchemaSet schemas = new System.Xml.Schema.XmlSchemaSet();
    schemas.Add("", @"Path to xsd");
    Console.WriteLine("Attempting to validate");
    XDocument UsrDoc = XDocument.Load(@"My xml file");
    bool errors = false;
    UsrDoc.Validate(schemas, (o, e) =>
                         {
                             Console.WriteLine("{0}", e.Message);
                             errors = true;
                         });
    Console.WriteLine("UsrDoc {0}", errors ? "did not validate" : "validated");
    Console.WriteLine();

我想将错误列表作为字符串列表返回,最重要的是包括行号。到目前为止,我已经失败了。

任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

我使用了XmlReader来验证

using (var stream = new FileStream("My xml file", FileMode.Open))
{
    var isErrorOccurred = false;

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;
    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
    settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
    settings.Schemas.Add("", "my schema");
    settings.ValidationEventHandler += (sender, args) =>
    {
        isErrorOccurred = true;
        Console.WriteLine("{0}", args.Exception.LineNumber);;
    };

    stream.Seek(0, SeekOrigin.Begin);
    XmlReader reader = XmlReader.Create(stream, settings);

    // Parse the file. 
    while (reader.Read())
    {}
    if (isErrorOccurred)
        // do something
}

答案 1 :(得分:0)

ValidationEventArgs中的XmlSchemaException具有LineNumber。 见:https://msdn.microsoft.com/de-de/library/system.xml.schema.xmlschemaexception(v=vs.110).aspx

你的代码中的

    UsrDoc.Validate(schemas, (o, e) =>
    {
      Console.WriteLine("Line {0}: {1}", e.Exception.LineNumber, e.Message);
      errors = true;
    });

还有其他有用的信息,例如LinePosition等。

编辑:我刚刚读到你想要一个字符串列表:在这种情况下,你必须在事件处理程序中构建这个列表,或者将你需要的信息传递给另一个方法。但是,我不确定在第一次错误后验证过程是否继续?也许你必须设置特定的设置才能让它继续运行。