C# 将xml转换为密钥对值

C# 将xml转换为密钥对值,c#,xml,C#,Xml,我有一个无法解决的问题,需要一个新的见解。我需要以下XML结构才能成为密钥对值 XML 我需要实现的是,在一个密钥对值中,我迷失了 谢谢 *更新的xml抱歉我个人会创建一个页面实体列表并反序列化它: [XmlRoot(name="page"] public class MyPage { [XmlElement(name="titel")] public string Title { get; set; } [XmlElement(name="url")] publ

我有一个无法解决的问题,需要一个新的见解。我需要以下XML结构才能成为密钥对值

XML

我需要实现的是,在一个密钥对值中,我迷失了

谢谢


*更新的xml抱歉

我个人会创建一个页面实体列表并反序列化它:

[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;
您的XML无效。你可以查一下

假设这是一个输入错误,并且您有以下格式的有效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

我相信您将添加正确的错误处理,在访问元素以应用某些方法或读取属性值之前,始终包括空检查,正如Shyju已经指出的,您的XML格式不好。我还假设您的意思是元素是title而不是titel?我在回答中使用了titel,因为这是XML字符串中的内容

我相信您可以通过以下方式实现您的目标:

编辑

我看到你编辑了你的问题,页面实际上是分层的。要处理此问题,可以创建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);

您的xml是递归形式的

如果需要存储父子关系,请使用嵌套类而不是dictionary类

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

XML似乎已损坏。您是否有要反序列化的类?您的XML示例中嵌套的元素不正确,并且根元素未关闭。可能存在重复的
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);
public class Page 
{ 
    public string Title { get; set; } 
    public string Url { get; set; } 
    public List<Page> childPage {get; set;}
}