【问题标题】:Converting an XML-document to a dictionary将 XML 文档转换为字典
【发布时间】:2010-12-15 04:13:12
【问题描述】:

我不需要编辑任何 XML 文件或任何东西,这仅用于读取和解析。

我希望能够将 XML 文档作为字典处理,例如:username = doc["username"];,但我不知道如何“转换”文档。我也遇到了重复键名的问题,但是可以通过在每个值后面附加 1、2 等来轻松避免这种情况;也可以很容易地进行 for 循环。

这可能吗?将(解析的)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"]等方式访问。

【问题讨论】:

  • XML 文档的结构是什么?
  • 您想如何处理子文档? &lt;doc&gt;&lt;x&gt;1&lt;/x&gt;&lt;foo&gt;&lt;a&gt;4&lt;/a&gt;&lt;b&gt;5&lt;/b&gt;&lt;/foot&gt;&lt;/doc&gt; 中的 doc["foo"] 返回什么?您需要说明您希望如何访问 doc/foo/a 以便我们提供帮助。
  • 包含节点的节点将被忽略,我只使用包含文本的节点。在您的示例中:x、a 和 b。

标签: c# xml dictionary parsing


【解决方案1】:

你可以使用 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);
}

【讨论】:

  • 谢谢!完全按照例外工作:)
【解决方案2】:

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

这个问题之前在这里被问过,所以你可以在这个链接中找到所有答案:

convert xml to sorted dictionary

希望对你有帮助。

【讨论】:

  • Ty,但我宁愿能够使用标记名,也不愿为所有内容添加属性。
【解决方案3】:

你的问题真的不是很清楚,但我认为这是你想要的:

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】:

    【讨论】:

    • 那是针对 C# 4.0 以及关于 ExpandoObject 和动态的使用,所以对我没有帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2017-02-17
    • 2015-06-03
    • 1970-01-01
    相关资源
    最近更新 更多