簡體   English   中英

Linq XML選擇最后一個父級並插入元素

[英]Linq XML select last parent and insert element

我必須建立這個XML檔案

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<K5project version="1.1">
   <networks>
      <modbus>
         <modbusport kind="master" address="127.0.0.1">
            <modbusreq name="" mode="Read Input Registers">
               <modbusitem ope="Data" offset="0" symbol="F1CU01_state_to_ias1" />
               <modbusitem ope="Data" offset="1" symbol="F1CU01_state_to_ias2" />
               <modbusitem ope="Data" offset="2" symbol="F1CU02_state_to_ias1" />
               <modbusitem ope="Data" offset="3" symbol="F1CU02_state_to_ias2" />
            </modbusreq>
            <modbusreq name="" mode="Read Input Registers">
               <modbusitem ope="Data" offset="0" symbol="F1CU01_state_to_ias1" />
               <modbusitem ope="Data" offset="1" symbol="F1CU01_state_to_ias2" />
            </modbusreq>
         </modbusport>
         <modbusport kind="master" address="127.0.0.2">
            <modbusreq name="" mode="Read Input Registers">
               <modbusitem ope="Data" offset="0" symbol="F1CU01_state_to_ias1" />
               <modbusitem ope="Data" offset="1" symbol="F1CU01_state_to_ias2" />
               <modbusitem ope="Data" offset="2" symbol="F1CU02_state_to_ias1" />
               <modbusitem ope="Data" offset="3" symbol="F1CU02_state_to_ias2" />
            </modbusreq>
            <modbusreq name="" mode="Read Input Registers">
               <modbusitem ope="Data" offset="0" symbol="F1CU01_state_to_ias1" />
               <modbusitem ope="Data" offset="1" symbol="F1CU01_state_to_ias2" />
            </modbusreq>
         </modbusport>
      </modbus>
   </networks>
   <fieldbus>
   </fieldbus>
</K5project>

因此,我要做的就是以這種方式創建“基本”初始模型:

private static XDocument CreateFieldBusAutoXmlBody()
        {
            XDocument fieldbusXML = new XDocument(
                new XDeclaration("1.0", "utf-16", "yes"),
                new XElement("K5Project",
                    new XAttribute("version", "1.1"),
                    new XElement("networks",
                        new XElement("modbus",
                            new XElement("modbusport",
                                new XAttribute("kind", "master"),
                                new XAttribute("address", "10.0.0." + "1")
                            )
                    )
            )));

            return fieldbusXML;
        }

因此,第一個<modbus>已經創建。 我需要做的是每100個modbusitem我要添加一個新的modbusreq 每10個modbusreq我需要添加一個新的modbusport

我正在嘗試選擇最后一個可用的modbusport ,在其中添加一個新的modbusreq 但是我做不到:我做到了

XElement elemToAddFromAutomation = fieldbusAutoXMLPac1.Descendants("modbusport").Last();

但這是錯誤的。

  • 如何選擇最后存在的modbusport
  • 是否有關於Linq XML的選擇和基礎搜索的不錯指南?

請創建一個新的控制台應用程序,並使用以下代碼(已成功,請享用):

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml.Serialization;

namespace ConsoleApp4
{
class Program
{
    static void Main(string[] args)
    {
        K5project k5Project = LoadXml("file.xml");
        var lastModbusport = k5Project.Networks.Modbus.Modbusport.Last();
        //here lastModbusport contain last Modbusport... enjoy it
    }

    private static K5project LoadXml(string filename)
    {
        var serializer = new XmlSerializer(typeof(K5project));

        if (!File.Exists(filename))
        {
            return null;
        }
        using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            return (K5project)serializer.Deserialize(fs);
        }
    }
}



[XmlRoot(ElementName = "modbusitem")]
public class Modbusitem
{
    [XmlAttribute(AttributeName = "ope")]
    public string Ope { get; set; }
    [XmlAttribute(AttributeName = "offset")]
    public string Offset { get; set; }
    [XmlAttribute(AttributeName = "symbol")]
    public string Symbol { get; set; }
}

[XmlRoot(ElementName = "modbusreq")]
public class Modbusreq
{
    [XmlElement(ElementName = "modbusitem")]
    public List<Modbusitem> Modbusitem { get; set; }
    [XmlAttribute(AttributeName = "name")]
    public string Name { get; set; }
    [XmlAttribute(AttributeName = "mode")]
    public string Mode { get; set; }
}

[XmlRoot(ElementName = "modbusport")]
public class Modbusport
{
    [XmlElement(ElementName = "modbusreq")]
    public List<Modbusreq> Modbusreq { get; set; }
    [XmlAttribute(AttributeName = "kind")]
    public string Kind { get; set; }
    [XmlAttribute(AttributeName = "address")]
    public string Address { get; set; }
}

[XmlRoot(ElementName = "modbus")]
public class Modbus
{
    [XmlElement(ElementName = "modbusport")]
    public List<Modbusport> Modbusport { get; set; }
}

[XmlRoot(ElementName = "networks")]
public class Networks
{
    [XmlElement(ElementName = "modbus")]
    public Modbus Modbus { get; set; }
}

[XmlRoot(ElementName = "K5project")]
public class K5project
{
    [XmlElement(ElementName = "networks")]
    public Networks Networks { get; set; }
    [XmlAttribute(AttributeName = "version")]
    public string Version { get; set; }
}
}

結果進入調試模式: 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM