我有一个很大的 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/