2010-10-09 30 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

相關問題