我有一种情况,我从外部公司收到XML(文档)文件.我需要过滤文档以删除我不感兴趣的所有数据.
该文件大约500KB,但将经常请求.
让我们说以下文件:
<dvdlist>
<dvd>
<title>title 1</title>
<director>directory 2</director>
<price>1</price>
<location>
<city>denver</city>
</location>
</dvd>
<dvd>
<title>title 2</title>
<director>directory 2</director>
<price>2</price>
<location>
<city>london</city>
</location>
</dvd>
<dvd>
<title>title 3</title>
<director>directory 3</director>
<price>3</price>
<location>
<city>london</city>
</location>
</dvd>
</dvdlist>
我需要的是简单地根据city = london过滤文档,以便最终得到这个新的XML文档
<dvdlist>
<dvd>
<title>title 2</title>
<director>directory 2</director>
<price>2</price>
<location>
<city>london</city>
</location>
</dvd>
<dvd>
<title>title 3</title>
<director>directory 3</director>
<price>3</price>
<location>
<city>london</city>
</location>
</dvd>
</dvdlist>
我尝试了以下内容
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Development\Website\dvds.xml");
XmlNode node = doc.SelectSingleNode("dvdlist/dvd/location/city[text()='london']");
任何帮助或链接将不胜感激
谢谢
解决方法:
XPath是一种选择表达式语言 – 它永远不会修改它所操作的XML文档.
因此,为了获得所需的新XML文档,您需要使用XML DOM(不推荐)或将XSLT转换应用于XML文档.后者是推荐的方法,因为XSLT是一种专为树转换而设计的语言.
在.NET中,可以使用XslCompiledTransform类及其Transform()方法.在relevant MSDN documentation中了解更多相关信息.
XSLT转换本身非常简单:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="dvd[not(location/city='london')]"/>
</xsl:stylesheet>
Here,您可以找到一个完整的代码示例,如何获取转换结果作为XmlDocument(或者如果需要,作为XDocument).