根据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);
}
});
}
试试下面的方法。
在文档加载之后,在验证之前,创建包含每个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);
}