2010-08-21 4 views
0

나는 상대적으로 작은 XML 내가 클릭 할 때 세 사진 상자에 관련 3 개 장의 사진을로드하는 것이 승리 양식에 세 개의 버튼 (PAGE1, 2 페이지, 3 페이지)합니다 (갖고 싶어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> 

파일이 3 장의 사진이 xml 파일의 같은 페이지에 있음).

내가 좋아하는 무언가를 뭔가가 필요 "XML을 선택할 경우 페이지 = X"

내가이 사용 XPath는 (/ 다른 XML 객체) 또는 트 리뷰 개체를 할 수 있다는 것을 알고 ...하지만 난 돈 ' 난 당신이 LINQ를 사용하는 것이 좋습니다

그래서 나는 당신의 도움 :) 감사해야합니다 ... Asaf

답변

2

입니다 그리고 여기 당신의 XML 데이터에 대한 코드입니다 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

호기심에서 벗어나서 LINQ to XML에 XPath를 사용하면 장점이 있습니까? – davehauser

+0

XPathDocument는 메모리에 완전한 개체 모델을 작성합니다. 이것은 W3C DOM 모델이 아니며 LINQ to XML 모델이 아니라 XPath 및 XSLT의 트리 모델이지만 완전한 XML 문서의 트리 모델입니다. 읽기 전용 모델이기 때문에 DOM 또는 LINQ to XML보다 약간 가볍지 만 질의 이외에 조작을 허용합니다. –

1

을 t 그 객체의 어떤 것에 대해 너무 많이 알고, 나는 확실히 각각의 장단점을 말할 수 없다 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으로는 그의 대답에, 나는 XML에 LINQ를 사용하는 것이 좋습니다 것입니다 기록합니다.

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(); 
관련 문제