<Clients>
<Client Id="1">
<Name>Granicentro</Name>
<Adresses>
<Adress Name="">
<Ip>111,111,111,111</Ip>
<Port>1111</Porta>
</Adress>
<Adress Name="2222">
<Ip>222,222,222,222</Ip>
<Port>2222</Porta>
</Adress>
<Adress Name="3333">
<Ip>333,333,333,333</Ip>
<Port>3333</Porta>
</Adress>
</Adresses>
</Client>
</Clients>
我有这个XML文档。如何获取所有客户/地址的列表?
我试过没有成功(没有例外,只是没有数据显示):
IEnumerable<string> adds= from client in XDocument.Load(@"D:\\Clients.xml")
.Descendants("Adresses")
where((string)cliente.Element("Name") == cliente)
select cliente.Element("Ip").Value;
将所有XML文件添加到此类列表中的正确方法是什么?:
class Client
{
public string ClientName{ get; set; }
public List<Adress> Adresses{ get; set; }
}
class Adress
{
public string AdressName{ get; set; }
public string IP { get; set; }
public int port{ get; set; }
}
List<Client> clientes = new List<Client>();
完整且可验证的示例: 我只需要XML文件中的数据在运行时进行操作。 现在我有这个查询来获取客户的名称:
IEnumerable<string> names = from client in XDocument.Load(@"D:\W\Clients.xml")
.Descendants("client")
orderby client.Element("Id") descending
select client.Element("name").Value;
然而,这只会返回我的名字,我需要所有的数据。此外,地址数量是可变的。
请根据需要编辑问题和/或标题。请注意任何提示,因为我已经用我的母语翻译了这段代码。
答案 0 :(得分:0)
您可以使用以下语法初始化对象:
var address = new Adress(){port = 80}
这将创建一个新的Adress
并将其port
属性设置为80
。它会将所有其他属性保留为默认值。
考虑到这些知识,你可以像这样编写你的linq
IEnumerable<Client> clients =
from client in XDocument.Load(@"D:\W\Clients.xml").Descendants("client")
orderby client.Element("Id") descending
select new Client()
{
ClientName = client.Element("name").Value,
Adresses = client.[Insert code to select addresses here]
.Select(address => new List<Adress>()
{
new Adress()
{
AdressName = address.[insert code to get address name here]
Ip = address.[insert code to get ip here]
port = address.[insert code to get port here]
}
}
.ToList()
};
答案 1 :(得分:0)
您的XML中存在多个拼写错误以及格式错误的XML(<port> is getting closed with </porta>
)。拼写错误(“地址”)不是问题,但我想你也想修复它。
鉴于上面的xml是固定的,映射到类的最简单方法是使用XmlSerializer。定义根节点以及类中适当的Xml属性。另请注意,您的类属性与XML存在大小写差异。
以下示例是我运行的快速测试,效果很好。
public class Client
{
[XmlElement("Name")]
public string ClientName { get; set; }
public List<Adress> Adresses { get; set; }
}
public class Adress
{
[XmlAttribute("Name")]
public string AdressName { get; set; }
[XmlElement("Ip")]
public string IP { get; set; }
[XmlElement("Port")]
public int port { get; set; }
}
private void Test()
{
var xml = @"<Clients>
<Client Id=""1"">
<Name>Granicentro</Name>
<Adresses>
<Adress Name=""5648"">
<Ip>111,111,111,111</Ip>
<Port>1111</Port>
</Adress>
<Adress Name=""2222"">
<Ip>222,222,222,222</Ip>
<Port>2222</Port>
</Adress>
<Adress Name=""3333"">
<Ip>333,333,333,333</Ip>
<Port>3333</Port>
</Adress>
</Adresses>
</Client>
</Clients>";
XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "Clients";
xRoot.Namespace = "";
xRoot.IsNullable = true;
List<Client> clients;
XmlSerializer ser = new XmlSerializer(typeof(List<Client>), xRoot);
using(StringReader r = new StringReader(xml))
{
clients = (List<Client>)ser.Deserialize(r);
}
//Clients collection now has your data.
}