数组索引的 XML 问题

本文关键字:问题 XML 索引 数组 | 更新日期: 2024-10-20 10:02:43

<?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>  

我正在尝试将服务器 XElements 和端口 XElements 添加到现有的 XML DOC 中。我尝试了以下代码,

int[] test = new int[3];
string[] PortName1 = new string[3];
string[] PortId1 = new string[3];
PortName1[0]="portname1";
PortName1[1] = "portname2";
PortName1[2] = "portname3";
PortId1[0] = "port1";
PortId1[1] = "port2";
PortId1[2] = "port3";
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)
                ))
        );

一切正常,但问题是PortName和PortId是字符串数组变量。不知道如何为"测试"的每次迭代获取索引动态值。对我来说,每次它只获取零索引值。

数组索引的 XML 问题

为什么需要测试数组?您应该使用 PortName1 数组或 PortId1,如下所示:

var portIdIndex = 0; // declare variable somewhere before
PortName1.Select(port =>
             new XElement("port",
                 new XAttribute("asset", port),
                 new XAttribute("portid", PortId1[portIdIndex++])
             ))

或者像这样:

PortName1.Select(port =>
             new XElement("port",
                 new XAttribute("asset", port),
                 new XAttribute("portid", PortId1[PortName1.IndexOf(port)])
             ))

或者,您可以使用匿名类型组合 PortId 和 PortName:

var portData = new [] { 
    new { PortName="Port 1", PortId = 1}, 
    new { PortName="Port 2", PortId = 2} 
};
portData.Select(port =>
     new XElement("port",
         new XAttribute("asset", port.PortName),
         new XAttribute("portid", port.PortId)
     ))

从用户输入中获取数据:

var portData = new List<string[]>();
// here we need to get data like this:
var portName = Console.ReadLine();
var portId = Console.ReadLine();
portData.Add(new string[]{portName, portId});
portData.Select(port =>
     new XElement("port",
         new XAttribute("asset", port[0]),
         new XAttribute("portid", port[1])
     ))

一个小演示。

如果您使用的是 .NET 4,则可以只使用 Zip

var server = 
    new XElement("server",
        new XAttribute("serverid", ServerId),
        new XAttribute("name", ServerName),
            PortName1.Zip(PortId1, (name, id) =>
                new XElement("port",
                    new XAttribute("asset", name),
                    new XAttribute("portid", id)
                ))
        );

如果您不使用 .NET 4 或更高版本,则可以在自己的代码中非常轻松地实现Zip - Eric Lippert 在博客文章中提供了示例代码。

(作为旁注,我鼓励您遵循 .NET 命名约定 - 例如,我会将PortId1PortName1的名称更改为 portIdsportNames