2010-10-09 48 views
3

我有一种情况,即从外部公司接收XML(文档)文件。我需要过滤文档以删除我不感兴趣的所有数据。 该文件大约500KB,但会经常请求。通过使用xpath在c#中过滤现有文档来创建新的XMLDocument

让的说以下文件:

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

我需要的基础上,城市只过滤文件=伦敦为了这个新的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']"); 

任何帮助或链接将欣赏

谢谢

+0

是否有你不想使用Linq到XML的特定原因? – 2010-10-09 17:06:15

+0

你是否真的面临任何问题?你试过一些东西;它工作? – Kangkan 2010-10-09 17:47:48

+0

@DoctaJonez。不,没有。如果Linq更适合,我会很乐意。 – Walid 2010-10-09 17:55:29

回答

1

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)。

+0

谢谢迪米特雷。我会去看看它,并会让你知道。感谢 – Walid 2010-10-09 23:08:15

+0

再次感谢Dimitre。最后,我遵循你的建议。在了解xpath的时候,XSLT是很简单的。 – Walid 2010-10-10 19:37:03

+0

@Walid:不客气。 – 2010-10-10 19:54:52

0

这里是一个使用LINQ to XML的例子。

//load the document 
var document = XDocument.Load(@"C:\Development\Website\dvds.xml"); 
//get all dvd nodes 
var dvds = document.Descendants().Where(node => node.Name == "dvd"); 
//get all dvd nodes that have a city node with a value of "london" 
var londonDVDs = dvds.Where(dvd => dvd.Descendants().Any(child => child.Name == "city" && child.Value == "london")); 
+0

谢谢DoctaJonez。我经历了下面的这个教程,因为我是Linq的新手 http://download.microsoft.com/download/c/f/b/cfbbc093-f3b3-4fdb-a170-604db2e29e99/XLinq%20Overview.doc 并且拥有下面的代码让我得到我需要的列表。 string path = @“C:\ Development \ Website \ sp.xml”; (“dvd”) 其中d.Element(“location”)。Element(“city”)。var dvds =从XElement.Load(path)。Value ==“london” select d; 我的问题是如何获取数据作为新的XmlDocument – Walid 2010-10-09 23:19:47

+0

如果您使用LINQ to XML(即XDocument),那么你应该创建一个新的XDocument,而不是一个XmlDocument。创建一个新的XDocument很简单:'XDocument input = XDocument.Load(“input.xml”); XDocument output = new XDocument(new XElement(input.Root.Name,input.Root.Elements(“dvd”)。Where(d =>(string)d.Element(“location”)。Element(“city”)= =“london”))); output.Save( “output.xml中”);'。 – 2010-10-10 10:44:15

+0

谢谢马丁。这非常有用。 – Walid 2010-10-10 21:55:43

相关问题