XmlSerializer - 迭代分支

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

我有一个由外部源提供的 xml。我对它们的设计或功能没有发言权。

我可以到达初始分支并根据需要读取值。我害怕编辑,因为我无法访问任何其他分支,如果我开始篡改主分支,我最终可能会删除除了我可以处理的分支之外的任何其他分支。

我的主分支如下: 容器\对象\对象\列表\对象\属性

<Container>
  <Object>
    <Object>
      <List>
        <Object>
          <Property>

我需要读取和更新的数据是

<Property>
中的属性。我有一个正在使用的 IntOrderID、FirstName、LastName。

我需要的是读取和更新 OrderID 的能力,这些 ID 位于以下不同的分支中:

容器\对象\对象(*)\列表\对象\属性

我在 Object(*) 下有 n 个分支,它们有一个属性 name=OrderID 的

<Property>
。就值而言,IntOrderID 和 OrderID 是完全相同的值。以前我使用 linq 读取和替换函数来完成我的工作。该解决方案还不够。

对于我的容器对象,我有: 编辑:23年9月18日我可能有一个顿悟时刻。

[XmlRoot(ElementName = "Object")]
public class Object
{
    [XmlElement(ElementName = "Property")]
    public List<Property> Property { get; set; }

    [XmlElement(ElementName = "List")]
    public List List { get; set; }

    [XmlElement(ElementName = "Object")]
    public Object ObjectLvl2 { get; set; }

    [XmlElement(ElementName = "Object")]
    public List<ObjectBranch> ObjectBranch { get; set; }  // TODO: There are n branches from this point.

    public Object() { }
}
[XmlRoot(ElementName = "ObjectBranch")]
public class ObjectBranch
{
    [XmlElement(ElementName = "List")]
    public List List { get; set; }

    public ObjectBranch() { }
}

编辑: 我使用包装器来访问序列化器,其中我使用 Discover() 来根据需要读取值:

/// <summary>
/// Discover the attributes from the xml file.
/// </summary>
public void Discover()
{
    foreach (var item in Container.ObjectLvl1.ObjectLvl2.List.ObjectLvl3.Property)
    {
        switch (item.Name)
        {
            case "IntOrderID":
                IntOrderID = item.Value;
                break;
            case "FirstName":
                FirstName = item.Value;
                break;
            case "LastName":
                LastName = item.Value;
                break;
            case "OrderID":
                OrderID = item.Value;
                break;
            default:
                break;
        }
    }
}

编辑23年5月10日

我的解决方案归结为

List<XElement> elementOID = xml.Descendants("Property")
    .Where(arg => arg.Attribute("name").Value == "OrderID")
    .ToList();

foreach (var orderID in elementOID)
{
   orderID.Attribute("value").Value = item.Value;
}

其中 item 指的是一个字典,我在其中保存所需的每个替换值(IntOrderID、Firstname、Lastname、OrderID)。

摘自 - 更新 XAttribute 值,其中 XAttribute Name = X

c# xml xmlserializer
1个回答
0
投票
    foreach (var item in replacements)
    {
        switch (item.Key)
        {
            case Patient.PropertyNames.IntOrderID:
                // IntOrderID
                var elementIOID = xml.Descendants("Property")
                    .Single(arg => arg.Attribute("name").Value == "IntOrderID");
                elementIOID.Attribute("value").Value = item.Value;
                break;
            case Patient.PropertyNames.Patient_FirstName:
                // Firstname, repeated code.
                break;
            case Patient.PropertyNames.Patient_LastName:
                // Lastname, repeated code.
                break;
            case Patient.PropertyNames.OrderID:
                // OrderID
                List<XElement> elementOIDs = xml.Descendants("Property")
                    .Where(arg => arg.Attribute("name").Value == "OrderID")
                    .ToList();

                foreach (var orderID in elementOIDs)
                {
                    orderID.Attribute("value").Value = item.Value;
                }
                break;
            default:
                break;
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.