Xml解析为列表

本文关键字:列表 Xml | 更新日期: 2023-09-27 18:24:01

我有一个xml文档,我需要将其解析为通用列表,甚至解析为数据表,因为我的最终目标是在网格中显示数据。我在写LINQ查询,我已经很接近了,但没能得到我想要的。XML结构:

<Datas preview="0">
    <meta>
        <inputOrder>
            <input>IPAddress</input>
            <input>name</input>
            <input>rawdata</input>
        </inputOrder>
    </meta>
    <data ID="0">
        <input k="IPAddress">
            <value>
                <text>ipaddress</text>
            </value>
        </input>
        <input k="name">
            <value>
                <text>some string</text>
            </value>
        </input>
        <input k="rawdata">
            <v xml:space="preserve" trunc="0">some data</v>
        </input>
    </data>
    <data ID="1">
        <input k="IPAddress">
            <value>
                <text>ipaddress</text>
            </value>
        </input>
        <input k="name">
            <value>
                <text>some string</text>
            </value>
        </input>
        <input k="rawdata">
            <v xml:space="preserve" trunc="0">some data</v>
        </input>
    </data>
</Datas>

到目前为止我的代码:

//dataobject is my generic list
XElement xml = XElement.Load("c:''test.xml");
var mydata = (from header in xml.Elements("data").Elements("input")
                select new dataobject
                {
                    ipaddress = ??
                    name= ??
                    rawdata=??
                }).ToList();
  1. 是否有有效的方法加载上述值
  2. 我最初想将的值动态加载到数据表列标题中,然后将值添加到其中,但如果有一种很好的方法可以做到这一点,甚至不必转换为列表,请告诉我

Xml解析为列表

一种可能的解决方案如下:

  • 创建DataObject结构
  • 获取所有数据节点
  • 对于每个数据节点,获取所有输入
  • 读取输入字段并创建DataObject
  • 将DataObject添加到列表
  • 使用列表将对象添加到数据库

DataObject类:

public class DataObject
{
    public String IP { get; set; }
    public String Name { get; set; }
    public String RawData { get; set; }
}

将文档解析为DataObject元素列表的代码(List<DataObject>):

try
{
    var result = new List<DataObject>();
    // helper function to fetch node value regarding attribute name
    Func<List<XElement>, String, String> getValueFromAttribute = (list, attributeName) => 
    {
        var r = list.FirstOrDefault(i => i.Attribute("k").Value.ToLower() == attributeName.ToLower());
        return r != null ? r.Value : String.Empty;
    };
    var xml = XDocument.Load("d:''temp''input.xml");
    // fetch all DATA nodes and iterate over every one
    xml.Root.Descendants("data").ToList().ForEach(data =>
    {
        // fetch INPUT nodes
        var inputs = data.Descendants("input").ToList();
        result.Add(new DataObject
        {
            IP = getValueFromAttribute(inputs, "ipaddress"),
            Name = getValueFromAttribute(inputs, "name"),
            RawData = getValueFromAttribute(inputs, "rawdata")
        });
    });
    result.ForEach(item =>
    {
        Console.WriteLine("{0} - {1} - {2}", item.IP, item.Name, item.RawData);
    });
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}

我修改了XML——每个数据节点都包含不同的值,所以使用上面的代码输入的是:

1 - A - RD A
2 - B - RD B

即使您只想将值直接添加到数据库中,DataObject类(对应于列表)也将帮助您轻松地传输值(提取并放入数据库)。

示例的输入xml:

<?xml version="1.0" encoding="utf-8"?>
<Datas preview="0">
    <meta>
        <inputOrder>
            <input>IPAddress</input>
            <input>name</input>
            <input>rawdata</input>
        </inputOrder>
    </meta>
    <data ID="0">
        <input k="IPAddress">
            <value>
                <text>1</text>
            </value>
        </input>
        <input k="name">
            <value>
                <text>A</text>
            </value>
        </input>
        <input k="rawdata">
            <v xml:space="preserve" trunc="0">RD A</v>
        </input>
    </data>
    <data ID="1">
        <input k="IPAddress">
            <value>
                <text>2</text>
            </value>
        </input>
        <input k="name">
            <value>
                <text>B</text>
            </value>
        </input>
        <input k="rawdata">
            <v xml:space="preserve" trunc="0">RD B</v>
        </input>
    </data>
</Datas>

data的集合中嵌套input的集合可能会遇到问题。

嵌套的数据不应在循环中,而应用作可查询的XElement,用于查询属性名称和值。

所以类似于:

xml.Elements("data").Select(data =>
    new dataobject {
        ipaddress = data.FirstOrDefault(el => el.Attribute("k") != null &&
                     el.Attribute("k").Value == "IPAddress");

使用其他请求的字段、漂亮的默认值和ToList()来完成此操作。