【问题标题】:What is the most elegant way to add some XML Elements to the XML produced by DataTable.WriteXML (C#) [closed]将一些 XML 元素添加到 DataTable.WriteXML (C#) 生成的 XML 中的最优雅方法是什么[关闭]
【发布时间】:2018-12-11 17:53:19
【问题描述】:

我试图找到一种“优雅的方式”来添加/修改从 DataTable.WriteXML 生成的 XML 中的一些 XML 元素

<?xml version="1.0" standalone="yes"?>
<DocumentElement>
  <Documents>
    <XMLelement1>Value1</XMLelement1>
    <XMLelement2>Value2</XMLelement2>
    <XMLelement3>Value3</XMLelement3>
  </Documents>
</DocumentElement>

但我想要这样的东西

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <SomeGroupElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <SomeGroupElement2 XMLElementA="ABCD" XMLElementB="123" XMLElementC="XYZ" XMLElementD="1">
            <SomeGroupElement2 XMLElementZ="KLM">
                <Grouping>
                    <XMLelement1>Value1</XMLelement1>
        <XMLelement2>Value2</XMLelement2>
        <XMLelement3>Value3</XMLelement3>
</Grouping>
</SomeGroupElement2>
</SomeGroupElement>

我已经使用 XSLT 进行了一些测试并即时添加元素......并且还通过使用 GetXML 来获取字符串并将其作为字符串进行操作,我觉得应该有一些更好的方法。
附言XMLelement1、XMLelement2、XMLelement3 是 DataTable/ 的字段及其值。
P.S.2 我很确定我没有正确使用 XML 术语,对此感到抱歉。

【问题讨论】:

  • 你试过LINQ to XML吗?
  • 首先,您需要将 XML 加载到 XElement:using (var ms = new MemoryStream()) { dataTable.WriteXml(ms); ms.Position = 0L; var xml = XElement.Load(ms); }
  • 我已经看到了这种将 XML 加载到 MemoryStream 中以避免 I/O 的技术,但我还没有找到“之后”
  • 您可以使用this answerthis one 中的静态方法将DataTable 直接序列化为XElement,然后使用LINQ to XML 添加其他元素。这避免了任何字符串操作或解析。

标签: c# xml


【解决方案1】:

您想向现有的 xml 文件添加其他项目。我的第一个解决方案是将现有项目包装到 DataSet 中。您的方法是在叶子中添加新元素。两者最终都有相似的 xml 文件

我会为每个分组创建一个包含单独表的 DatatSet。从数据表中,您可以创建新的数据表,如下所示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;


namespace ConsoleApplication92
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            //source datatable
            DataTable dt = new DataTable();

            var groups = dt.AsEnumerable().GroupBy(x => new { a = x.Field<string>("ColumnA"), b = x.Field<string>("ColumnB"), c = x.Field<string>("ColumnC") }).ToList();

            DataSet ds = new DataSet();

            foreach(var group in groups)
            {
                DataTable newDt = group.CopyToDataTable();
                dt.TableName = string.Join("_", new object[] { group.Key.a, group.Key.b, group.Key.c });
                ds.Tables.Add(newDt);
            }

            ds.WriteXml(FILENAME, XmlWriteMode.WriteSchema);

        }
    }
}

方法二

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

namespace ConsoleApplication91
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {

            XDocument doc = XDocument.Load(FILENAME);

            XElement documents = doc.Descendants("Documents").FirstOrDefault();

            XElement groupElement = new XElement("SomeGroupElement2", new object[] {
                new XAttribute("XMLElementA","ABCD"),
                new XAttribute("XMLElementB","123"),
                new XAttribute("XMLElementC","XYZ"),
                new XAttribute("XMLElementD","1")
            });

            documents.ReplaceWith(groupElement);
            XElement grouping = new XElement("Grouping");
            groupElement.Add(grouping);

            for(int i = 1; i <= 3; i++)
            {
                XElement newXElement = new XElement("XMLelement" + i.ToString(), "Value" + i.ToString());
                grouping.Add(newXElement);
            }

        }
    }

}

【讨论】:

  • 好吧,如果它是一个复杂的 XML,那就太好了……它非常简单……只需将分组“文档”替换为“分组”,将“文档元素”替换为“SomeGroupElement2”和只需添加上面的元素...无论如何感谢您的回答。
  • 它很优雅!!!从您发布的内容来看,您在评论中描述的内容并不明显。我会完全按照你们明天早上所说的去做。
  • 我在现有解决方案中添加了新的 xml。您想向现有 xml 文件添加其他项目。我的第一个解决方案是将现有项目包装到 DataSet 中。您的方法是在叶子中添加新元素。两者都以相似的 xml 文件结尾,但我的更优雅!!!
  • 好吧,groupElement 看起来很酷,但它取代了其余的文档...我希望它成为文档的父级
  • 它仍然是文档的一部分。我遵循了您发布的预期 xml。
猜你喜欢
  • 2010-11-05
  • 1970-01-01
  • 2010-09-23
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 2012-05-08
相关资源
最近更新 更多