2012-07-18 78 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;} 
}