数组索引的 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是字符串数组变量。不知道如何为"测试"的每次迭代获取索引动态值。对我来说,每次它只获取零索引值。
为什么需要测试数组?您应该使用 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 命名约定 - 例如,我会将PortId1
和PortName1
的名称更改为 portIds
和 portNames
。