使用linq将XML结构按元素展开为XML
本文关键字:XML 元素 结构 linq 使用 | 更新日期: 2023-09-27 18:23:52
我最近创建了一篇关于扁平化XML结构的文章,以便将每个元素及其值都转换为根元素上的属性。得到了一些很好的答案,并使它发挥了作用。然而,可悲的是,通过扁平化,客户端意味着扁平化元素,而不是将它们变成属性:-/
我有这个:
<members>
<member xmlns="mynamespace" id="1" status="1">
<sensitiveData>
<notes/>
<url>someurl</url>
<altUrl/>
<date1>somedate</date1>
<date2>someotherdate</date2>
<description>some description</description>
<tags/>
<category>some category</category>
</sensitiveData>
<contacts>
<contact contactId="1">
<contactPerson>some contact person</contactPerson>
<phone/>
<mobile>mobile number</mobile>
<email>some@email.com</email>
</contact>
</kontakter>
</member>
</members>
我需要的是以下内容:
<members>
<member xmlns="mynamespace" id="1" status="1">
<sensitiveData/>
<notes/>
<url>someurl</url>
<altUrl/>
<date1>somedate</date1>
<date2>someotherdate</date2>
<description>some description</description>
<tags/>
<category>some category</category>
<contacts/>
<contact contactId="1"></contact>
<contactPerson>some contact person</contactPerson>
<phone/>
<mobile>mobile number</mobile>
<email>some@email.com</email>
</member>
</members>
所以基本上所有的元素,但是被展平为的子节点。我知道这样开始解析XML文档一点都不好,但这基本上是唯一的选择,因为我们要导入数据的CMS需要这种平面结构,而XML文档来自外部Web服务。
我开始为此制作一个递归方法,但我有一种奇怪的感觉,那就是使用一些LINQ to XML可以使它更平滑(好吧,至少尽可能平滑)(?)我不是最擅长LINQ to XML的,所以我希望有人能帮我提示如何解决这个问题?:-)
这似乎奏效了——诚然,可能有更整洁的方法:
var doc = XDocument.Load("test.xml");
XNamespace ns = "mynamespace";
var member = doc.Root.Element(ns + "member");
// This will *sort* of flatten, but create copies...
var descendants = member.Descendants().ToList();
// So we need to strip child elements from everywhere...
// (but only elements, not text nodes). The ToList() call
// materializes the query, so we're not removing while we're iterating.
foreach (var nested in descendants.Elements().ToList())
{
nested.Remove();
}
member.ReplaceNodes(descendants);