C#Net核心XML反序列化或如何获取文件中行的索引

问题描述 投票:0回答:1

请告诉我,在反序列化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。不支持简单的元素和属性!

c# xml validation .net-core deserialization
1个回答
0
投票

这可以通过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;
© www.soinside.com 2019 - 2024. All rights reserved.