从Dictionary中创建XML文档的问题

时间:2014-10-01 15:12:44

标签: c# dictionary linq-to-xml

我的目的是遍历我可爱的字典(键和值都是字符串)并从中创建一个xml文件。

我在最后一行收到错误(保存xml)。

  

“InvalidOperationException未处理   状态Document中的Token EndDocument将导致XML文档无效。“

使用断点查看它似乎在达到此结束时,只有初始位(在每个循环之外)已经完成..

我一半都在问我犯了什么愚蠢的错误,我部分地问是否有更有说服力的做法。

很抱歉,如果我遗漏了任何内容,请告诉我,如果我有,请添加。

XDocument xData = new XDocument(
                   new XDeclaration("1.0", "utf-8", "yes"));

foreach (KeyValuePair<string, string> kvp in inputDictionary)
{ 
        xData.Element(valuesName).Add(
            new XElement(valuesName, 
            new XAttribute("key", kvp.Key),
            new XAttribute("value", kvp.Value)));
}

xData.Save("C:\\xData.xml");

2 个答案:

答案 0 :(得分:4)

目前,您正在向文档添加多个元素 - 因此您最终会得到 no 根元素(如果字典为空)或可能< em>多个根元素(如果字典中有多个条目)。你想要一个根元素,然后是你的字典元素。此外,您正在尝试找到一个名为valuesName的元素,而不会添加任何内容,因此如果有任何字典条目,您实际上会获得NullReferenceException

幸运的是,它比你制作它更容易,因为你可以使用LINQ将你的字典转换成一系列元素并将其放在doc中。

var doc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"),
    new XElement("root",
        inputDictionary.Select(kvp => new XElement(valuesName,
                                           new XAttribute("key", kvp.Key),
                                           new XAttribute("value", kvp.Value)))));
doc.Save(@"c:\data.xml");

完整示例应用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

class Test
{    
    static void Main()
    {
        XName valuesName = "entry";
        var dictionary = new Dictionary<string, string>
        {
            { "A", "B" },
            { "Foo", "Bar" }
        };
        var doc = new XDocument(
            new XDeclaration("1.0", "utf-8", "yes"),
            new XElement("root",
                dictionary.Select(kvp => new XElement(valuesName,
                                               new XAttribute("key", kvp.Key),
                                               new XAttribute("value", kvp.Value)))));
        doc.Save("test.xml");
    }
}

输出(不保证条目的顺序):

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<root>
  <entry key="A" value="B" />
  <entry key="Foo" value="Bar" />
</root>

另一种细分方法是:

var elements = inputDictionary.Select(kvp => new XElement(valuesName,
                                       new XAttribute("key", kvp.Key),
                                       new XAttribute("value", kvp.Value)));
var doc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"),
    new XElement("root", elements));

您可能会发现这更容易阅读。

答案 1 :(得分:1)

尝试以下

XDocument xData = new XDocument(
                   new XDeclaration("1.0", "utf-8", "yes"));

               XElement myXml = new XElement("paramList");// make sure your root and your descendents do not shre same name
               foreach (var entry in MyList)
                {
                       myXml.Add(new XElement(valuesName,
                                new XElement("key", entry.key),
                                new XElement("value", entry.Value)
               ));

xData.Add(myXml);