Преобразование XML-документа в словарь - PullRequest
10 голосов
/ 10 ноября 2009

Мне не нужно редактировать какой-либо XML-файл или что-либо еще, это только для чтения и анализа.

Я хочу иметь возможность обрабатывать XML-документ как словарь, например: username = doc["username"];, но я не могу выяснить, как "преобразовать" документ. Я также столкнулся с проблемой дублирования имен ключей, но этого можно легко избежать, добавив каждое значение с 1, 2 и т. Д .; упрощая цикл тоже.

Возможно ли это? Рассматривать (анализируемый) XML-документ как словарь?


Ответ Мехрдаду: Время от времени меняется, зависит от запроса пользователя. Если пользователь запрашивает x, то это будет:

<xml>
    <test>foo</test>
    <bar>123</bar>
    <username>foobar</username>
</xml>

Но если он запросит y, это будет похоже на

<xml>
    <ammount>1000</ammount>
    <mail>...@...</mail>
    <username>foobar</username>
</xml>

Лучше всего было бы, если это:

<xml>
<mengde>100</mengde>
<type>3</type>
<mail>foo</mail>
<crypt>bar</crypt>
<username>bar</username>
</xml>"

Может быть проанализирован и затем доступен как doc["mengde"] и т. Д.

Ответы [ 4 ]

15 голосов
/ 10 ноября 2009

Вы можете использовать linq to xml, чтобы делать то, что вы хотите (если я понимаю, что вы хотите)

string data = "<data><test>foo</test><test>foobbbbb</test><bar>123</bar><username>foobar</username></data>";

XDocument doc = XDocument.Parse(data);
Dictionary<string, string> dataDictionary = new Dictionary<string, string>();

foreach (XElement element in doc.Descendants().Where(p => p.HasElements == false)) {
    int keyInt = 0;
    string keyName = element.Name.LocalName;

    while (dataDictionary.ContainsKey(keyName)) {
        keyName = element.Name.LocalName + "_" + keyInt++;
    }

    dataDictionary.Add(keyName, element.Value);
}
4 голосов
/ 10 ноября 2009

Ваш вопрос действительно не очень понятен, но я думаю, что он делает то, что вы хотите:

XmlDocument doc = new XmlDocument();
doc.LoadXml(@"<xml>
<mengde>100</mengde>
<type>2</type>
<foo>bar</foo>
</xml>");

Dictionary<string, string> d = new Dictionary<string, string>();
foreach (XmlNode n in doc.SelectNodes("/xml/*")
{
   d[n.Name] = n.Value;
}
4 голосов
/ 10 ноября 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>

Код конверсии

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);
}

Этот вопрос был задан ранее здесь, и вы можете найти все ответы по этой ссылке:

преобразование xml в отсортированный словарь

Надеюсь, это поможет.

0 голосов
/ 10 ноября 2009

Это не совсем то, что вы ищете, но может представлять интерес: http://blogs.msdn.com/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx

...