gpt4 book ai didi

c# - .NET 反序列化后 XML 中的对象位置(行、列)

转载 作者:数据小太阳 更新时间:2023-10-29 01:55:24 25 4
gpt4 key购买 nike

在使用 XmlSerializer 反序列化为 .NET 对象后,如何获取 xml 标记在原始 xml 文件中的位置?

这是一个例子XML

  <ArrayOfAddressDetails>
<AddressDetails>
<Number>4</Number>
<Street>ABC</Street>
<CityName>Bern</CityName>
</AddressDetails>
<AddressDetails>
<Number>3</Number>
<Street>ABCD</Street>
<CityName>Prague</CityName>
</AddressDetails>
</ArrayOfAddressDetails>

XML 到 C# 对象的映射

[XmlRoot("Root")]
public class AddressDetails
{
[XmlElement("Number")]
public int HouseNo;
[XmlElement("Street")]
public string StreetName;
[XmlElement("CityName")]
public string City;
}

想要的结果

 XmlSerializer serializer = new XmlSerializer(typeof(List<AddressDetails>));
var list = serializer.Deserialize(@"C:\Xml.txt") as List<AddressDetails>;

// this is what I would like to do

// getting information to origin of the property City of the 2nd object in the list
var position = XmlSerializerHelper.GetPosition(o => list[1].City, @"C:\Xml.txt");

// should print "starts line=10, column=8"
Console.WriteLine("starts line={0}, column={1}", position.Start.Line, position.Start.Column);

// should print "ends line=10, column=35"
Console.WriteLine("ends line={0}, column={1}", position.End.Line, position.Start.Column);

// should print "type=XmlElement, name=CityName, value=Prague"
Console.WriteLine("xml info type={0}, name={1}, value={2}", position.Type, position.Name, position.Value);

最佳答案

另一种更简单的方法:让反序列化器完成工作。

  • LineInfoLinePosition 属性添加到您希望获得其位置信息的所有类:

    [XmlRoot("Root")]
    public class AddressDetails
    {
    [XmlAttribute]
    public int LineNumber { get; set; }

    [XmlAttribute]
    public int LinePosition { get; set; }
    ...
    }

    这当然可以通过子类化来实现。

  • 使用 LoadOptions.SetLineInfo 加载一个 XDocument

  • 为所有元素添加 LineInfoLinePosition 属性:

    foreach (var element in xdoc.Descendants())
    {
    var li = (IXmlLineInfo) element;
    element.SetAttributeValue("LineNumber", li.LineNumber);
    element.SetAttributeValue("LinePosition", li.LinePosition);
    }
  • 反序列化将填充 LineInfoLinePosition

缺点:

  • 仅针对反序列化为类的元素的行信息,不适用于简单元素,不适用于属性。
  • 需要为所有类添加属性。

关于c# - .NET 反序列化后 XML 中的对象位置(行、列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22173213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com