将System.Collections.Generic.Dictionary转换为XDocument
本文关键字:转换 XDocument Dictionary Generic System Collections | 更新日期: 2023-09-27 18:12:51
我正在尝试将Dictionary转换为XDocument (XML),以便稍后在我的应用程序中更容易解析。
应用程序将基于XDocument生成Word文档。我朋友会寄给我一本字典,所以我必须自己翻译。
这是我到目前为止得到的,但我被卡住了。我实在想不出怎么继续:
static XDocument Parse(Dictionary<String, String> dic)
{
XDocument newXDoc = new XDocument();
List<String> paragraphs = new List<String>();
int count = 0;
foreach(KeyValuePair<string,string> pair in dic)
{
if (pair.Key.Equals("paragraph" + count))
{
paragraphs.Add(pair.Value);
count++;
}
}
newXDoc.Add(new XElement("document",
new XElement("title",dic["title"])));
return newXDoc;
}
所以要解释:
我的想法是使XML文档像这样:
<document>
<title>Some Title</title>
<paragraph0>some text</paragraph0>
<paragraph1>some more text on a new line</paragraph1>
<paragraph2>
<list>
<point>Some Point</point>
<point>Some other point</point>
</list>
</paragraph2>
<header>
<author>me</author>
<date>today</date>
<subject>some subject</subject>
</header>
</document>
我的问题是,我永远不知道我将收到多少段落,因为我发送的只是一本字典。正如你可能知道的,我正在考虑如何制作一个漂亮的foreach
结构,它可以:
- 暂时删除所有段落
- 用合适的XElement的 填充XDocument
我只是不知道如何做到这一点,而不遇到可能的NullPointerExceptions或类似的。有什么帮助吗?
简短版本:在不知道可能得到多少段的情况下,如何将Dictionary解析为XDocument ?
当前一段到达换行符('n)
使用LinqToXML,这将把所有以"paragraph"开头的字典键放入文档中:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Text;
var dict = new Dictionary<string, string>()
{
{ "paragraph0", "asdflkj lksajlsakfdj laksdjf lksad jfsadf P0"},
{ "paragraph1", " alkdsjf laksdjfla skdfja lsdkfjadsflk P1"},
{ "paragraph2", "asdflkj lksajlsakfdj laksdjf lksad jfsadf P2"}
};
XDocument xd = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"),
new XElement("document",
dict.Where(kvp => kvp.Key.ToLower().StartsWith("paragraph"))
.Select(kvp => new XElement(kvp.Key, kvp.Value)),
new XElement("header", "etc")
)
);
第一段可以这样写:
Dictionary<String, String> dic = new Dictionary<String, String>();
dic.Add("title", "Some Title");
dic.Add("test", "a string");
dic.Add("paragraph0", "some text");
dic.Add("paragraph1", "some more text on a new line");
dic.Add("another test", "a string");
// -----
XDocument newXDoc = new XDocument();
newXDoc.Add(new XElement("document",
new XElement("title", dic["title"]),
dic.Where((kvp)=>kvp.Key.StartsWith("paragraph")).Select((kvp)=>new XElement("paragraph", dic[kvp.Key]))));
String s=newXDoc.ToString();
Console.WriteLine(s);
然而,第三段取决于你的输入