我有一个表,其中具有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的子代,这显然不是我的意图。
如何实现我的预期输出?
答案 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中-因此,如果数据对您来说足够快,那就没问题了。