请告诉我,在反序列化XML文件后是否可以获取行号,从中获取特定属性的值。或者还有其他方法吗?我需要在文件中找到发生错误的行号(有错误的标记路径,例如yml_catalog / offers / offer [1] / price)
我这里有这样一个模型,其中有来自标签的值:
[XmlRoot("yml_catalog")]
public class YMLCatalog
{
/// <summary>
/// Time of generation
/// </summary>
[Required]
[XmlAttribute("date")]
public string Date { get; set; }
/// <summary>
/// Shop
/// </summary>
[Required]
[ValidateObject]
[XmlElement(ElementName = "shop")]
public Shop Shop { get; set; }
}
/// <summary>
/// Sale point
/// </summary>
public class Shop
{
/// <summary>
/// Shop name
/// </summary>
[Required]
[XmlElement("name")]
public string Name { get; set; }
/// <summary>
/// Company name
/// </summary>
[Required]
[XmlElement("company")]
public string Company { get; set; }
... etc
}
ValidationObject - 这是通过Validator.TryValidateObject(context,[我的空模型对象],[ValidationResult列表 - 错误列表],true)进行递归验证的属性;
使用正则表达式查找行号不适合我,因为文件可能非常大并且有大量错误,我只有错误消息和路径
Example of file在第一个标签'offer'中出错(标签价格为空)
UPD - This solution is not suitable。不支持简单的元素和属性!
这可以通过LINQ完成。如果要获取有关数字和位置的节点的信息,则应使用XmlDocument方法而不是SelectNode方法,使用XPathSelectElement,并将其带到接口IXmlLineInfo
XDocument xdoc = XDocument.Load(file, LoadOptions.SetLineInfo);
var node = xdoc.XPathSelectElement("//shop/offers/offer[1]/price");
var lineNumber = ((IXmlLineInfo)node).LineNumber;