c# - 根据属性值复制部分 XML 文件

标签 c# xml parsing copy xml-parsing

我有一个很大的 xml 文件,需要创建该文件的部分“副本”。 (使用 C#) 我需要保持相同的 xml 结构,但只需要条件为“真”的部分。

示例结构:

<?xml version="1.0" encoding="utf-8"?>
<country name="Netherlands">
    <region name="NH">
        <city name="Aalsmeer">
            <district name="Some district">
            <part type="slum" />
            </district>
            <contact adres="StreetName" telephone="0000000000" valid="false" />
            <residents number="10000" />
            <homes number = "7000" />
        </city>
        <city name="Heemskerk">
            <district name="Some district">
                <part type="workersDistrict" />
            </district>
            <contact adres="StreetName" telephone="0000000000" valid="true" />
            <residents number="10000" />
            <homes number = "7000" />
        </city>
        </region>
        <region name="ZH">
            <city name="Rotterdam">
                <district name="Some district">
                <part type="workersDistrict" />
                </district>
                <contact adres="StreetName" telephone="0000000000" valid="true" />
                <residents number="10000" />
                <homes number = "7000" />
            </city>
            <city name="Moerdijk">
                <district name="Some district">
                    <part type="residential area" />
                </district>
                <contact adres="StreetName" telephone="0000000000" valid="false" />
                <residents number="10000" />
                <homes number = "7000" />
            </city>
            </region>
</country>

我只需要属性“valid”为“true”的“city”元素。 新的 XML 文件应如下所示:

<?xml version="1.0" encoding="utf-8"?>
    <country name="Netherlands">
        <region name="NH">
            <city name="Heemskerk">
                        <district name="Some district"
                    <part type="workersDistrict" />
                </district>
                <contact adres="StreetName" telephone="0000000000" valid="true" />
                <residents number="10000" />
                <homes number = "7000" />
            </city>
        </region>
        <region name="ZH">
            <city name="Rotterdam">
                <district name="Some district"
                    <part type="workersDistrict" />
                </district>
                <contact adres="StreetName" telephone="0000000000" valid="true" />
                <residents number="10000" />
                <homes number = "7000" />
            </city>
        </region>
    </country>

如何尽快完成这项工作(考虑到城市元素的数量(例如 100630)和文件大小(例如 63,0 MB)?

最佳答案

使用修改后的 identity transform ,您可以简单地匹配要抑制的元素并提供一个空模板。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output indent="yes" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!--suppress any city elements that do not have contact/@valid='true' -->
    <xsl:template match="city[not(contact/@valid='true')]" />

</xsl:stylesheet>

You can execute the XSLT in C# like this :

using System;
using System.Xml;
using System.Xml.Xsl; 
namespace XSLTransformation
{
    /// Summary description for Class1.
    class Class1
    {
        static void Main(string[] args)
        {
            XslTransform myXslTransform; 
            myXslTransform = new XslTransform();
            myXslTransform.Load("books.xsl"); 
            myXslTransform.Transform("books.xml", "ISBNBookList.xml"); 

        }
    }
}

关于c# - 根据属性值复制部分 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7770326/

相关文章:

parsing - Haskell:如何将 IO 输入字符串解析为 Float(或 Int 或其他)?

python - 使用python解析或读取cpp文件并通过忽略cpp文件注释添加数据

c# - .Take() 的位置对生成的 SQL 没有影响

c# - 实现多个通用接口(interface) - 类型错误

c# - 控制繁忙 GUI 的最佳实践

php - 具有 rtmp 格式的 JW 播放器的动态 XML 播放列表。

java - Context.xml 中名称 ="jdbc/project"的说明?

c# - 具有非必需参数的 SQL 存储过程

java - 如何在 SAML 响应中使用 X509 证书作为公钥

java - 解析文本——Scanner 还是 BufferedReader?