我有一个大的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>
我只需要'city'元素,其中'valid'属性为'true'。 新的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)?
答案 0 :(得分:2)
使用修改后的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");
}
}
}
答案 1 :(得分:0)
我建议您查看linq到xml: