Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于属性值复制XML文件的部分_C#_Xml_Parsing_Copy_Xml Parsing - Fatal编程技术网

C# 基于属性值复制XML文件的部分

C# 基于属性值复制XML文件的部分,c#,xml,parsing,copy,xml-parsing,C#,Xml,Parsing,Copy,Xml Parsing,我有一个很大的xml文件,需要创建该文件的部分“副本”。使用C 我需要保持相同的xml结构,但只需要条件为“true”的部分 示例结构: <?xml version="1.0" encoding="utf-8"?> <country name="Netherlands"> <region name="NH"> <city name="Aalsmeer"> <district name="Some

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

示例结构:

<?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),如何尽快完成此操作?

我建议您检查linq to xml:

例如:

MSDN:

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

<?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>

我尝试将linq转换为xml。因此,我得到了:如何让其他元素写入新的文件国家/地区城市换句话说,如何在最终的xml文件中获得与示例中相同的结果我的代码:XDocument myFile=XDocument.LoadxmlFile;var query=来自myFile.degenantsContact中的c,其中c.Attributevalid.Value==true选择c;查询{MessageBox.showlem.ToString;}中的foreach var elem这听起来非常有趣。我如何在C中使用它?我不是很有经验;-我已经用示例代码更新了答案,以调用C中的转换,并链接到它复制的页面;因此,没有匹配的城市元素。xsl文件有问题吗?哎呀!很抱歉。我已经用正确的XPath更新了答案。我收到一条警告:“System.Xml.Xsl.XslTransform”已过时:“此类已被弃用。”。请改用System.Xml.Xsl.XslCompiledTransform。”当我将“XslTransform”更改为“xslcomiledtransform”时,我猜想新的xml文件包含许多来自城市元素的空行,这些元素没有contact/@valid='true''XslTransform'工作正常,但建议使用“xslcomiledtransform”。如何删除空行?
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"); 

        }
    }
}