2012-07-18 75 views
0

我有一個無法解決的問題,需要一個新的見解。我需要以下XML結構才能成爲密鑰對值。C#xml到密鑰對值

XML

<?xml version="1.0" encoding="utf-8"?> 
<data> 
    <page> 
    <title>Home</title> 
    <url>http://data.home.nl</url> 
    <page> 
     <title>link 1</title> 
     <url>http://data.home.nl/link1.aspx</url> 
     <page> 
      <title>link 2</title> 
      <url>http://data.home.nl/link/link2.aspx</url> 
      <page> 
       <title>link 3</title> 
       <url>http://data.home.nl/link/link/link3.aspx</url> 
      </page> 
      <page> 
       <title>Test 4</title> 
       <url>http://data.home.nl/link/link/test4.aspx</url> 
      </page> 
      <page> 
       <title>Test 5</title> 
       <url>http://data.home.nl/link/link/test5.aspx</url> 
      </page> 
      <page> 
       <title>Test 6</title> 
       <url>http://data.home.nl/link/link/test6.aspx</url> 
      </page> 
      <page> 
       <title>Test 7</title> 
       <url>http://data.home.nl/link/link/test7.aspx</url> 
      </page> 
     </page> 
     </page> 
    </page> 
</data> 

什麼,我需要做到的是在一個密鑰值,我迷路了....

謝謝!

*更新XML對不起

+0

的XML似乎打破。你有一些課要反序列化? – mattanja 2012-07-18 13:56:16

+0

您的XML示例具有錯誤嵌套的元素,並且根元素未關閉。 – vcsjones 2012-07-18 13:58:19

+0

[使用linq從xml獲取鍵值對]可能的重複(http://stackoverflow.com/questions/1716004/get-key-value-pairs-from-xml-using-linq) – CJM 2012-07-19 13:18:53

回答

0

個人而言,我創建頁面實體的名單和反序列化:

[XmlRoot(name="page"] 
public class MyPage 
{ 
    [XmlElement(name="titel")] 
    public string Title { get; set; } 
    [XmlElement(name="url")] 
    public string Url { get; set; } 
} 

然後反序列化到:

List<MyPage> pages; 
0

你的XML是不有效的。你可以檢查它here

假設它是一個拼寫錯誤,並且你有以下格式的有效XML。

<?xml version="1.0" encoding="utf-8"?> 
<data> 
    <page> 
     <titel>link 3</titel> 
     <url>http://data.home.nl/link/link/link3.aspx</url> 
    </page> 
    <page> 
     <titel>Test 4</titel> 
     <url>http://data.home.nl/link/link/test4.aspx</url> 
    </page>   
</data> 

然後你可以使用LINQtoXML進行查詢,並做你想做的

Dictionary<string, string> dictionary = new Dictionary<string, string>(); 

var path = Server.MapPath("~/Content/pairs.xml"); 

XElement elm = XElement.Load(path); 
//you can also load the XML from a stream /Textreader etc.. 

if (elm != null) 
{  
    foreach (var page in elm.Elements("page")) 
    { 
     var title = page.Element("titel").Value; 
     var url = page.Element("url").Value; 
     dictionary.Add(title, url); 
    } 
} 
//dictionary is filled now 

我相信你會添加適當的錯誤處理(通常包括null檢查之前訪問元素應用一些方法或讀取屬性值)

1

正如Shyju已經指出的,您的XML格式不正確。我還假設你的意思是title而不是titel?我在回答中使用了titel,因爲這是您在XML字符串中的內容。

我相信你可以使用LINQ to XML實現你的結果:

var xmlString = // set your xml string here 
var xml = System.Xml.Linq.XElement.Parse(xmlString); 

var myDictionary = xml.Elements() 
    .Select(e => new KeyValuePair<string, string>(
     e.Element("titel").Value, 
     e.Element("url").Value)) 
    .ToDictionary(k => k.Key, v => v.Value); 

編輯

我看你已經編輯你的問題和網頁實際上是分層次的。爲了解決這個問題,你可以創建一個LINQ擴展方法來處理遞歸:

public static IEnumerable<T> Recursive<T>(
    this IEnumerable<T> source, 
    Func<T, IEnumerable<T>> recursiveFunc) 
{ 
    foreach (T item in source) 
    { 
     yield return item; 
     var result = recursiveFunc(item); 

     if (result != null) 
     { 
      foreach (T nextItem in Recursive(result, recursiveFunc)) 
      { 
       yield return nextItem; 
      } 
     } 
    } 
} 

,然後創建你的字典裏是這樣的:

var myDictionary = xml.Elements() 
    .Recursive(e => e.Elements()) 
    .Where(e => e.Element("title") != null && e.Element("url") != null) 
    .Select(e => new KeyValuePair<string, string>(
     e.Element("title").Value, 
     e.Element("url").Value)) 
    .ToDictionary(k => k.Key, v=> v.Value); 
0

你的XML是遞歸形式。

如果需要存儲父子關係,使用嵌套類,而不是Dicitionary

public class Page 
{ 
    public string Title { get; set; } 
    public string Url { get; set; } 
    public List<Page> childPage {get; set;} 
}