根据现有属性的值编辑新属性并将其插入XML文件

时间:2019-02-15 22:07:11

标签: c# xml

我有一个结构如下的XML文件: 我读过的所有示例都显示了插入节点,但没有如下所述。

<asset>
         <vehicle inUse="true">
            <type>sedan</type>
            <model>735i</model>
            <make>BMW</make>
            <year>2017</year>
          </vehicle>

         <vehicle inUse="true">
            <type>sedan</type>
            <model>735i</model>
            <make>BMW</make>
            <year>2016</year>
          </vehicle>
</asset>

我想进行批量编辑,并在具有最高年份值的现有车辆节点之后插入一个新的车辆节点。所以在2017年之后

例如,上面的代码将最终如下所示:

<asset>
         <vehicle inUse="true">
            <type>sedan</type>
            <model>735i</model>
            <make>BMW</make>
            <year>2017</year>
          </vehicle>

<!-- new node here-->

         <vehicle inUse="true">
            <type>sedan</type>
            <model>735i</model>
            <make>BMW</make>
            <year>2010</year>
          </vehicle>

         <vehicle inUse="true">
            <type>sedan</type>
            <model>735i</model>
            <make>BMW</make>
            <year>2016</year>
          </vehicle>
</asset>

2 个答案:

答案 0 :(得分:1)

您可以将xml转换为xmlString,并且应该搜索最高年份值在哪里,并获取其索引

XElement root = XElement.Parse(xmlString);
var vehicles= root.Descendants("vehicle").ToArray();
var elementBeforeInsert = vehicles[index+1];
elementBeforeInsert.AddBeforeSelf(new XElement("vehicle")); // insert your vehicle here

答案 1 :(得分:0)

var xml = XElement.Load("test.xml");
var maxYear = xml.Elements().Max(e => (int)e.Element("year"));
var newestVehicle = xml.Elements().First(e => (int)e.Element("year") == maxYear);
newestVehicle.AddAfterSelf(new XElement("vehicle"));

此代码效率不高,因为它在xml上进行了两次传递。

如果连接MoreLinq库,代码将变得更加简单:

var xml = XElement.Load("test.xml");
var newestVehicle = xml.Elements().MaxBy(e => (int)e.Element("year")).First();
newestVehicle.AddAfterSelf(new XElement("vehicle"));