Запросить XML-файл? - PullRequest
       6

Запросить XML-файл?

0 голосов
/ 21 августа 2010

У меня относительно небольшой 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) в выигрышной форме, чтобы при нажатии на них они загружали соответствующие 3 изображения в поле из трех изображений (эти три изображения находятся под одной страницей в XML-файле).

Мне нужно что-то вроде «выберите из XML, где страница = X»

Я знаю, что могу сделать это, используя xpath (/ другие объекты xml) или объект древовидной структуры ... но я не знаю много о любом из этих объектов, и я, конечно, не могу сказать плюсы и минусы каждый ...

Так что мне нужна твоя помощь :) Спасибо Асаф

Ответы [ 3 ]

2 голосов
/ 21 августа 2010

Как пишет @ 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();
2 голосов
/ 21 августа 2010

Вот решение, включающее 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));    
1 голос
/ 21 августа 2010

Я предлагаю вам использовать LINQ to XML

Пример кода от: ссылка

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...