我具有以下XML结构:
<root>
<list>
<item1>item 1</item1>
<item2>item 2</item2>
<item3>item 3</item3>
<item4>item 4</item4>
<generated-items>
<item5>item 5</item5>
<item6>item 6</item6>
</generated-items>
</list>
<list>
<item1>item 1</item1>
<item2>item 2</item2>
<item3>item 3</item3>
<item4>item 4</item4>
<generated-items>
<item5>item 5</item5>
<item6>item 6</item6>
</generated-items>
</list>
<list>
<item1>item 1</item1>
<item2>item 2</item2>
<item3>item 3</item3>
<item4>item 4</item4>
<generated-items>
<item5>item 5</item5>
<item6>item 6</item6>
</generated-items>
</list>
</root>
我要做的是删除XML文件重复部分的父标记,这将导致以下结果:
<root>
<list>
<item1>item 1</item1>
<item2>item 2</item2>
<item3>item 3</item3>
<item4>item 4</item4>
<item5>item 5</item5>
<item6>item 6</item6>
</list>
<list>
<item1>item 1</item1>
<item2>item 2</item2>
<item3>item 3</item3>
<item4>item 4</item4>
<item5>item 5</item5>
<item6>item 6</item6>
</list>
<list>
<item1>item 1</item1>
<item2>item 2</item2>
<item3>item 3</item3>
<item4>item 4</item4>
<item5>item 5</item5>
<item6>item 6</item6>
</list>
</root>
做到这一点的最佳方法是什么?我试图复制子节点并将其粘贴到重复列表元素中,使它们成为该部分的一部分,然后将所有的generation-items元素一起删除。尽管我不确定这是否是实现此目的的最佳方法,并且这种方式很快就会变得凌乱。
答案 0 :(得分:1)
最好的方法是使用XSLT-1.0将输入XML转换为所需的输出XML。
这可以通过使用XslCompiledTransform
来实现。
以下样式表(transform.xslt
)完成了该工作:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="generated-items">
<xsl:copy-of select="*" />
</xsl:template>
</xsl:stylesheet>
必要的C#代码与链接中的示例相同:
// Load the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("transform.xslt");
// Execute the transform and output the results to a file.
xslt.Transform("input.xml", "output.xml");
然后output.xml
包含您想要的数据。
答案 1 :(得分:0)
使用Xml Linq:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
List<XElement> generated_items = doc.Descendants("generated-items").ToList();
foreach (XElement generated_item in generated_items)
{
generated_item.AddAfterSelf(generated_item.Descendants());
generated_item.Remove();
}
}
}
}
答案 2 :(得分:-1)
假设您正在使用linq2xml,则可以执行以下操作:
ModelA