从数据库中获取XML并将其合并

时间:2018-08-23 10:30:46

标签: c# .net xml linq-to-xml

我有一个表,其中具有xml数据类型的列具有许多采用以下格式的xml。

 <Hash HashValue = "9738839398923">
     <Element1>
            <childelement1 attribute1 = "..." attribute2 = "...">
            <childelement2 attribute1 = "..." attribute2 = "...">
            <childelement3 attribute1 = "..." attribute2 = "...">
    </Element1>
    <Element2>
           ......
           ......
    </Element2>
</Hash>

现在,我想从表中获取所有这些行并合并它们。我已经完成了获取部分,并将其存储在数据表中。

为进行合并,我在此站点上使用了不同的解决方案,但无法获得令人满意的结果。

预期的输出格式:

    <Hash HashValue = "4972904980">
         .......
         ......
     </Hash>
    <Hash HashValue = "4534543">
         .......
         ......
     </Hash>
   <Hash HashValue = "536456456456">
         .......
         ......
     </Hash>

我到目前为止最接近的是:

<Hash HashValue = "4972904980">
      <Hash HashValue = "4534543">
         .......
         ......
     </Hash>
  </Hash>

以上输出的代码:

            FileStream file = File.Open(fakePath, FileMode.Create);
            XElement xFileRoot = XElement.Parse(dt.Rows[0]["ColumnName"].ToString());
            XElement xFileChild = XElement.Parse(dt.Rows[1]["ColumnName"].ToString());
            xFileRoot.Add(xFileChild);
            xFileRoot.Save(file); 

以上代码清楚地将第二个xml视为第一个xml的子代,这显然不是我的意图。

如何实现我的预期输出?

2 个答案:

答案 0 :(得分:1)

要使XML有效,必须有1个单个根元素。

您要添加下一个“元素”作为根的子代。如果root和child元素是同一元素,则这没有任何意义。

我建议您简单地创建一个虚拟的根元素,称为? rootElement?

XmlElement xFileRoot = doc.CreateElement("rootElement");

然后

foreach(var row in dt.Rows)
{
   XElement xFileChild = XElement.Parse(row["ColumnName"].ToString());
   xFileRoot.Add(xFileChild);
}

,对于所有意图,请忽略该根元素存在。

换句话说,您想要的结果不是有效的XML。

答案 1 :(得分:1)

XML仅允许单个根元素。因此,您需要显式创建该元素-它不能是您现有的元素之一。

一种实现方式:

        XDocument xDocument = new XDocument();
        var root = new XElement("root");
        xDocument.Add(root);

        root.Add(XElement.Parse("<entry hash='1'/>"));
        root.Add(XElement.Parse("<entry hash='2'/>"));

        var output = string.Join("\r\n", root.Elements());

您应该代替记录中的两个root.Add语句。

这不是创建XML的最有效方法-但也没有将数据读取到DataTable中-因此,如果数据对您来说足够快,那就没问题了。