2010-08-21 72 views
0

我有一個相對較小的XML文件查詢XML文件?

<g> 
    <page no="1" href="page1.xml" >   
     <pic src="20100101001.jpg">1</pic> 
     <pic src="20100101002.jpg">2</pic> 
     <pic src="20100101003.jpg">3</pic>   
    </page> 
    <page no="2" href="page2.xml" >   
     <pic src="20100101011.jpg">1</pic> 
     <pic src="20100101012.jpg">2</pic> 
     <pic src="20100101013.jpg">3</pic>    
    </page> 
    <page no="3" href="page3.xml" >  
     <pic src="20100101021.jpg">1</pic> 
     <pic src="20100101022.jpg">2</pic> 
     <pic src="20100101023.jpg">3</pic>    
    </page> 
</g> 

我希望能有一個雙贏的形式,單擊時它們加載三張圖片框相關三張照片上有三個按鍵(第1頁第2頁第3頁)(中三張圖片在xml文件的同一頁面下)。

我需要的東西,做東西,如「從XML選取頁= X」

我知道我可以做到這一點使用XPath(/其他XML對象)或一個TreeView對象......但我不」知道很多有關的任何這些對象,我肯定不能告訴對方的優點和缺點...

所以我需要你的幫助:) 感謝 阿薩夫

回答

2

這裏涉及XPathDocument和XPath的解決方案。這比使用Linq(XDocument)或XmlDocument更關注內存,因爲它不會在內存中建立DOM。對於小文件,這通常無關緊要,但XPathDocument在大輸入時會快得多。

string page = "page1.xml"; 
XPathDocument xdoc = new XPathDocument(@"C:\tmp\smpl6.xml"); 

XPathNodeIterator result = xdoc.CreateNavigator() 
    .Select(string.Format("/g/page[@href = '{0}']/pic/@src", page)); 

foreach (XPathNavigator item in result) 
{ 
    Trace.WriteLine(item.Value); 
} 

您可以很容易地更改該XPath表達式,例如,按頁碼過濾:

int pageNo = 2; 
XPathNodeIterator result = xdoc.CreateNavigator() 
    .Select(string.Format("/g/page[@no = '{0}']/pic/@src", pageNo));  
+0

只是出於好奇,是否有利用XPath而不是LINQ to XML? – davehauser 2010-08-21 15:58:40

+0

XPathDocument在內存中構建完整的對象模型。它不是一個W3C DOM模型,它不是一個LINQ to XML模型,而是一個XPath和XSLT的樹模型,但它是完整XML文檔的樹模型。它可能比DOM或LINQ to XML輕一點,因爲它是隻讀模型,除了查詢之外,它們還允許操作。 – 2010-08-21 16:50:19

1

我建議你使用LINQ到XML

示例代碼:link

XDocument loaded = XDocument.Load(@"C:\contacts.xml"); 


// Query the data and write out a subset of contacts 
var q = from c in loaded.Descendants("contact") 
    where (int)c.Attribute("contactId") < 4 
    select (string)c.Element("firstName") + 「 「 + 
     (string)c.Element("lastName"); 


foreach (string name in q) 
    Console.WriteLine("Customer name = {0}", name); 
2

正如@ mehmet6parmak寫在他的回答,我會建議使用LINQ to XML。這裏是爲您的XML數據的代碼:

using System.Xml.Linq; 

XDocument doc = XDocument.Load(@"C:\Path\To\XmlFile"); 

int pageNo = 1; 
var page = e.Descendants("page").FirstOrDefault(x => x.Attribute("no").Value == pageNo.ToString()); 

如果你有網頁和圖片類,如這些

public class Page 
{ 
    public int No {get;set;} 
    public string Href {get;set;} 
    public IList<Picture> Pictures {get;set;} 
} 
public class Picture 
{ 
    public string Source {get;set;} 
} 

你可以從XML如下生成它們:

using System.Xml.Linq; 

var xPage = e.Descendants("page").FirstOrDefault(x => x.Attribute("no").Value == "1"); 
var page = new Page 
{ 
    No = Convert.ToInt32(xPage.Attribute("no").Value), 
    Href = xPage.Attribute("href").Value 
}; 
page.Pictures = xPage.Descendants("pic").Select(x => new Picture { Source = x.Attribute("src").Value }).ToList();