2014-09-22 67 views
0

我有一个XML文档,我需要将其解析为通用列表,甚至是数据表,因为我的最终目标是显示网格中的数据。我正在写LINQ查询,并且我非常接近,但无法达到我想要的。 XML结构: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. 我最初想动态加载的值加载到一个DataTable的有效途径列标题,然后将值添加到它,但如果有一个很好的方式做甚至不必转换为列表请让我知道

回答

0

一种可能的解决方案可以是这样的:

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

DataObject类:

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

的代码到文档解析到数据对象元素的列表(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类(resp。该列表)将帮助您轻松传输值(提取并放入数据库)。

我输入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> 
0

您可能会遇到以data为一套的input套件的嵌套问题。

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

因此,像:

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

完成这与其他要求的领域,美观大方默认,和ToList()

+0

由于某种原因,数据没有必须的财产FirstOrDefault,但很喜欢您的查询的简单感谢您的迅速反应 – learner999 2014-09-22 23:00:49