конвертировать xml в отсортированный словарь - PullRequest
2 голосов
/ 17 марта 2009

У меня есть XML-файл, похожий на этот:

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <resource key="123">foo</resource>
    <resource key="456">bar</resource>
    <resource key="789">bar</resource>

</data>

Я хочу поместить это в словарь (отсортированный) в виде пар ключ-значение. то есть: 123: Foo, 456: бар ... и т.д.

ключи неизвестны.

как я могу это сделать?

Ответы [ 5 ]

8 голосов
/ 17 марта 2009

Это похоже на работу для Linq to Xml

    static void Main(string[] args)
    {            
        XDocument yourDoc = XDocument.Load("the.xml");
        var q = from c in yourDoc.Descendants("resource")
                orderby (int) c.Attribute("key")
                select c.Attribute("key").Value + ":" + c.Value;

        foreach (string s in q)
            Console.WriteLine(s);                            
        Console.ReadLine();
    }
6 голосов
/ 17 марта 2009

Это на самом деле проще без использования Linq и просто с помощью XmlDocument:

SortedDictionary<string, string> myDict = new SortedDictionary<string, string>();
foreach (XmlElement e in myXmlDocument.SelectNodes("/data/resource"))
{
   myDict.Add(e.GetAttribute("key"), e.Value);
}
5 голосов
/ 17 марта 2009

Попробуйте это,

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);
}
2 голосов
/ 17 марта 2009

Использовать LINQ:

Загрузить документ XDocument.Load или XDocument.Parse:

var xml = XDocument.Load(...);

Итерация в упорядоченной последовательности:

var sequence = from e in xml.Root.Elements() 
               let key = (string)e.Attribute("key")
               order by key
               select new { 
                 Key = key, 
                 Value = (string)e 
               };
0 голосов
/ 17 марта 2009

Я бы сделал это с XSLT-преобразованием. Вам нужно сделать работу с C #? Если нет, вы можете просто создать документ XSLT, который анализирует все теги ресурсов и выводит ключ: значение для вас разобрано. Очень просто. Это решение, которое вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...