使用C#动态地将XElements添加到XAttribute

时间:2013-12-16 07:23:39

标签: c# xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<servers>  
  <server serverid="server1" asset="Sample" >
    <port portid ="port1" asset="Sample"  ></port>  
    <port portid ="port2" asset="Sample"  ></port>      
  </server>

  <server serverid="server2" asset="Sample" >
    <port portid ="port1" asset="Sample"  ></port> 
    <port portid ="port2" asset="Sample"  ></port>    
    <port portid ="port3" asset="Sample"  ></port>
    <port portid ="port4" asset="Sample"  ></port>        
  </server>
<server serverid="server1" asset="Sample" >
    <port portid ="port1" asset="Sample"  ></port> 
    <port portid ="port2" asset="Sample"  ></port>    
    <port portid ="port3" asset="Sample"  ></port>   
  </server>

</servers>  

我正在尝试将Server XElements和端口XElements添加到现有的XML DOC中。我尝试使用for&amp; forEach将端口Xelements添加到服务器Xelement。这里的技巧是端口XElemnts的数量因服务器而异。请帮我解决这个问题。 以下是示例代码,我试过了。

var xdoc = XDocument.Load("C:\\sample.xml");
             var server = new XElement("server",
                 new XAttribute("serverid", ServerId),
                 new XAttribute("name", ServerName),
                 (foreach(var sample in test)
                 {
                 new XElement("port",
                     new XAttribute("asset", PortName),
                     new XAttribute("portid", PortId));
                 });

1 个答案:

答案 0 :(得分:2)

奇怪的是,你没有在循环中使用sample变量。但是,如果要为port集合中的每个项目添加新的test元素,则应将每个项目投影到XElement并返回这些元素的集合:

 var fileName = @"C:\sample.xml";
 var xdoc = XDocument.Load(fileName);

 var server = 
     new XElement("server",
         new XAttribute("serverid", ServerId),
         new XAttribute("name", ServerName),
             test.Select(sample =>
                 new XElement("port",
                     new XAttribute("asset", PortName),
                     new XAttribute("portid", PortId)
                 ))
         );

请记住,foreach循环不会返回任何内容。但是您需要为正在创建的服务器元素提供价值。

 xdoc.Root.Add(server);
 xdoc.Save(fileName);