2014-09-22 69 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