简体   繁体   English

在运行时从DataTable向XDocument添加元素

[英]Adding elements to XDocument at runtime from DataTable

I am trying to generate an XML using XDocument by pulling data from a DataTable at runtime. 我试图通过在运行时从DataTable中提取数据来使用XDocument生成XML。 I want to have the output in this format: 我想使用以下格式的输出:

<Document>
  <Alphabets>
    <Data>
      <Capital>AAA</Capital>
      <Small>aaa</Small>
    </Data>    
  </Alphabets>
  <Language>
      <Name>English</Name>
  </Language>
  <Alphabets>
    <Data>
      <Capital>BBB</Capital>
      <Small>bbb</Small>
    </Data>
  </Alphabets>
  <Language>
      <Name>English</Name>
  </Language>
</Document>

The Language element has to be present after every Alphabets element. Language元素必须出现在每个Alphabets元素之后。 I have tried very hard to achieve this but I am unable to put this Alphabets tag after every Language element. 我已经尽力实现这一目标,但是我无法在每个Language元素之后放置这个Alphabets标签。 What I have achieved is this, where the Language element is falling inside Alphabets element: 我已经实现了这一点,其中Language元素位于Alphabets元素之内:

<Document>
  <Alphabets>
    <Data>
      <Capital>AAA</Capital>
      <Small>aaa</Small>
    </Data>
    <Language>
      <Name>English</Name>
    </Language>
  </Alphabets>
  <Alphabets>
    <Data>
      <Capital>BBB</Capital>
      <Small>bbb</Small>
    </Data>
    <Language>
      <Name>English</Name>
    </Language>
  </Alphabets>
</Document>  

Here is my code : 这是我的代码:

        static void Main(string[] args)
        {
            DataTable dtAlpha = new DataTable("Alphabetss");
            dtAlpha.Columns.Add("Capital", typeof(string));
            dtAlpha.Columns.Add("Small", typeof(string));

            dtAlpha.Rows.Add("AAA", "aaa");
            dtAlpha.Rows.Add("BBB", "bbb");

            XDocument doc = new XDocument(
                new XDeclaration("1.0", "UTF-8", null),
                new XElement("Document",
                        from row in dtAlpha.AsEnumerable()
                        select new XElement("Alphabets",
                            new XElement("Data",
                                new XElement("Capital", row.Field<string>("Capital")),
                                new XElement("Small", row.Field<string>("Small"))
                                         ),
                        new XElement("Language",
                            new XElement("Name", "English")
                            )))
                            );
            Console.WriteLine(doc.ToString());
            Console.ReadKey();
        }  

Please help me on this. 请帮我。

You can try this way : 您可以这样尝试:

XDocument doc = new XDocument(
    new XDeclaration("1.0", "UTF-8", null),
    new XElement("Document")
);

foreach(var row in dtAlpha.AsEnumerable())
{
    var alphabets = new XElement("Alphabets",
                        new XElement("Data",
                            new XElement("Capital", row.Field<string>("Capital")),
                            new XElement("Small", row.Field<string>("Small"))
                        )
                    );
    var language = new XElement("Language",
                        new XElement("Name", "English")
                    );
    doc.Root.Add(alphabets);
    doc.Root.Add(language);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM