将完整的XML文件放入列表

时间:2016-05-03 16:41:46

标签: c# xml

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

然而,这只会返回我的名字,我需要所有的数据。此外,地址数量是可变的。

请根据需要编辑问题和/或标题。请注意任何提示,因为我已经用我的母语翻译了这段代码。

2 个答案:

答案 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.
}