查询XML文件?

时间:2010-08-21 14:08:50

标签: c# xml xpath treeview

我有一个相对较小的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>

我希望在win表单上有三个按钮(第1页,第2页,第3页),点击它们会在三个图片框中加载相关的3张图片(这三张图片在xml文件的同一页面下)。

我需要做的事情就像“从xml中选择page = X”

我知道我可以使用xpath(/其他xml对象)或treeview对象来做到这一点......但是我对这些对象中的任何一个都不太了解,我当然也说不出它的优点和缺点。每个...

所以我需要你的帮助:) 谢谢 阿萨夫

3 个答案:

答案 0 :(得分: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());

如果你有像这样的Page和Picture类

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();

答案 1 :(得分: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));    

答案 2 :(得分:1)

我建议您使用LINQ to 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);