0

我正在尝试将字典制作成 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结构,它可以:

  1. 暂时取出所有段落
  2. 用适当的 XElement 填写 XDocument

我只是不知道如何在不遇到可能的 NullPointerExceptions 或类似情况的情况下做到这一点。有什么帮助吗?

简短版本:在给定上述结构的情况下,我如何将字典解析为 XDocument,不知道我可以获得多少段?

新段落定义为前一段到达换行符 (\n)

4

2 回答 2

2

使用 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")
                )
            );
于 2013-05-08T09:05:01.863 回答
0

好吧,第一段可以这样写:

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

但是,第三段取决于您的输入。

于 2013-05-08T09:04:45.263 回答