根据c#的错误行号获取XML记录号

本文关键字:获取 记录 XML 错误 根据 | 更新日期: 2023-09-27 18:13:37

下面是我的XML,我试图根据发生错误的行号获得记录/行号。例如,如果验证错误发生在值0.53,即第6行,我想知道它的记录号在这里是1,添加id="1", id="2" ..etc到record将是一个不错的选择,但根据我的要求,XML格式不能更改。

<?xml version='1.0' encoding='utf-8'?>
<records>
  <record>
    <date>2016-02-01</date>
    <id>3</id>
    <value>0.53</value>
    <unit>mtrs</unit>
  </record>
  <record>
    <date>2016-02-01</date>
    <id>4</id>
    <value>0.13</value>
    <unit>mtrs</unit>
  </record>
  <record>
    <date>2016-02-01</date>
    <id>7</id>
    <value>0.13</value>
    <unit>mtrs</unit>
  </record>
</records>

以下是我的代码,我使用IXmlLineInfo

获得错误行信息
        //get the input file here
        var httpRequest = HttpContext.Current.Request;
        if (httpRequest.Files.Count > 0)
        {
            var postedFile = httpRequest.Files[0];
            //sete the xsd schema path                    
            string xsdPath = HttpContext.Current.Server.MapPath("~/XSD/MyFile.xsd");
            //set the XSD schema here
            var schema = new XmlSchemaSet();
            schema.Add("", xsdPath);
            var Message = "";
            //validate the xml schema here
            XDocument document = XDocument.Load(postedFile.InputStream, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo | LoadOptions.SetBaseUri);
            //create a lists to add the error records
            List<string> lstErrors = new List<string>();
            document.Validate(schema, ValidationEventHandler);
            //validate all the errors
            document.Validate(schema, (sender, args) =>
             {
                 IXmlLineInfo item = sender as IXmlLineInfo;
                 if (item != null && item.HasLineInfo())
                 {
                     //capture all the details needed here seperated by colons
                     Message = item.LineNumber + ";" +
                     (((System.Xml.Linq.XObject)item).Parent.Element("id")).Value + ";" +
                     ((System.Xml.Linq.XElement)item).Name.LocalName + ";" +
                     args.Message + Environment.NewLine;
                     //add the error to a list
                     lstErrors.Add(Message);
                 }
             });
        }

根据c#的错误行号获取XML记录号

试试下面的方法。

在文档加载之后,在验证之前,创建包含每个record元素的索引和id信息的字典。

XDocument document = XDocument.Load(...);
var dict = document.Root.Elements("record")
    .Select((r, index) => new { r, index })
    .ToDictionary(a => a.r, a => a.index);

然后在验证事件

中使用此字典
if (item != null && item.HasLineInfo())
{
    Message = dict[((XObject)item).Parent] + ";" +
        item.LineNumber + ";" +
        (((XObject)item).Parent.Element("id")).Value + ";" +
        ((XElement)item).Name.LocalName + ";" +
        args.Message + Environment.NewLine;
    lstErrors.Add(Message);
}