我的目的是遍历我可爱的字典(键和值都是字符串)并从中创建一个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");
答案 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);