C# 基于属性值复制XML文件的部分
我有一个很大的xml文件,需要创建该文件的部分“副本”。使用C 我需要保持相同的xml结构,但只需要条件为“true”的部分 示例结构: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 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");
}
}
}