我有一个由外部源提供的 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)。
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;
}
}