0

我有一个无法再解决的问题,需要新的见解。我需要以下 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 抱歉

4

4 回答 4

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);
于 2012-07-18T14:16:05.217 回答
0

Personally, I'd create a list of Page entities and deserialize it:

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

Then deserialize into:

List<MyPage> pages;
于 2012-07-18T13:58:35.163 回答
0

您的 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

我相信您会添加适当的错误处理(始终包括null在访问元素以应用某些方法或读取属性值之前进行检查)

于 2012-07-18T14:10:56.407 回答
0

您的 xml 采用递归形式。

如果需要存储父子关系,使用嵌套类代替字典

public class Page 
{ 
    public string Title { get; set; } 
    public string Url { get; set; } 
    public List<Page> childPage {get; set;}
} 
于 2012-07-18T15:05:23.857 回答