C# 使用linq到XML按元素展平XML结构
我最近写了一篇关于扁平化XML结构的文章,这样每个元素及其值都被转换为根元素上的属性。我得到了一些很好的答案,并且成功了。然而,可悲的是,通过展平,客户机意味着展平元素,而不是将它们变成属性:-/ 我所拥有的是:C# 使用linq到XML按元素展平XML结构,c#,xml,linq-to-xml,xml-parsing,C#,Xml,Linq To Xml,Xml Parsing,我最近写了一篇关于扁平化XML结构的文章,这样每个元素及其值都被转换为根元素上的属性。我得到了一些很好的答案,并且成功了。然而,可悲的是,通过展平,客户机意味着展平元素,而不是将它们变成属性:-/ 我所拥有的是: <members> <member xmlns="mynamespace" id="1" status="1"> <sensitiveData> <notes/> <
<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>
某物
某天
改天
一些描述
某类
一些联系人
手机号码
some@email.com
我需要的是:
<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>
某物
某天
改天
一些描述
某类
一些联系人
手机号码
some@email.com
所以基本上是所有元素,但被展平为的子节点。我知道,像这样开始解析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);
嗨,乔恩,这确实有效!非常感谢:)我似乎唯一弄不明白的事情(请容忍,在XML解析方面,我不是最锋利的刀)是如何保留元素的属性。当您复制元素时,它们似乎已被删除?:)@bomortensen:在这种情况下,它们似乎没有被移除-例如,我仍然有contactId=“1”。。。哦,我刚刚注意到它从
成员
元素本身删除了属性。将修复此问题,请稍候。@bomortensen:是的,已修复-最后一行现在是ReplaceNodes,而不是ReplaceAllit有意思的是,foreach中的substant
(var-substant in-substands)
从未使用过。@Meysam:这是一个bug-哎呀!否则,它将无法对深度嵌套的元素执行正确的操作。