2012-08-16 307 views
2

美好的一天,C#XML数据转换成字典

我一直在玩的ToDicationary()扩展方法

var document = XDocument.Load(@"..\..\Info.xml"); 
XNamespace ns = "http://www.someurl.org/schemas"; 

var myData = document.Descendants(ns + "AlbumDetails").ToDictionary 
    (
     e => e.Name.LocalName.ToString(), 
     e => e.Value 
    ); 

Console.WriteLine("Writing music..."); 
foreach (KeyValuePair<string, string> kvp in myData) 
{ 
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value); 
} 

与下面的XML数据:

<?xml version="1.0" encoding="UTF-8"?> 
<Database xmlns="http://www.someurl.org/schemas"> 
    <Info> 
     <AlbumDetails> 
      <Artist>Ottmar Liebert</Artist> 
      <Song>Barcelona Nights</Song> 
      <Origin>Spain</Origin> 
     </AlbumDetails> 
    </Info> 
</Database> 

和我没有得到我想要的输出。相反,我得到这个:

Writing music... 
AlbumDetails = Ottmar LiebertBarcelona NightsSpain 

相反,我想myData的(“艺术家”)=“奥特马尔·利伯特”,等等

是否有可能做的后代?

TIA,

COSON

+0

我不认为你可以从'AlbumDetails'的**后代**创建一本字典。艺术家,歌曲,起源可能不是唯一的。 – 2012-08-16 19:56:06

回答

2

下面将简单地得到AlbumDetails节点:

document.Descendants(ns + "AlbumDetails") 

你想直接后代(子节点) - 因为这些也是要素:

document.Descendants(ns + "AlbumDetails").Elements() 

Th e全行将是:

var myData = document.Descendants(ns + "AlbumDetails") 
      .Elements().ToDictionary(
             e => e.Name.LocalName.ToString(), 
             e => e.Value 
            ); 
+0

也许不是后代,而是孩子(元素)。 – 2012-08-16 19:55:11

+0

@JeffMercado - 我不相信'Children'是LINQ to XML的扩展方法。 – Oded 2012-08-16 19:56:44

+0

我的意思是说,他可能只想抓取“AlbumDetails”节点的子元素,所以他需要'Elements()'方法,而不是'DescendantNodes()'。 – 2012-08-16 19:58:57

1

试试这个。

string s = "<data><resource key=\"123\">foo</resource><resource key=\"456\">bar</resource><resource key=\"789\">bar</resource></data>"; 
XmlDocument xml = new XmlDocument(); 
xml.LoadXml(s); 
XmlNodeList resources = xml.SelectNodes("data/resource"); 
SortedDictionary<string,string> dictionary = new SortedDictionary<string,string>(); 
foreach (XmlNode node in resources){ 
    dictionary.Add(node.Attributes["key"].Value, node.InnerText); 
} 
+0

似乎你回答你自己的问题,而不是OP的问题。 – 2012-08-16 20:03:53

+0

@ L.B--看起来像回答一般性问题,使用自己的XML而不是OP的使用...并且像OP那样使用'XmlDocument'而不是'XDocuement'。 – Oded 2012-08-16 20:10:21