如何删除父节点而不删除其子节点?

时间:2019-09-16 17:46:12

标签: c# xml

我具有以下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元素一起删除。尽管我不确定这是否是实现此目的的最佳方法,并且这种方式很快就会变得凌乱。

3 个答案:

答案 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