2010-08-11 6 views
5

से XElement का चयन करना मैं वास्तव में मदद मांगना नहीं चाहता था क्योंकि मुझे पता है कि मैं अंततः इसे समझूंगा, लेकिन दस्तावेज़ में मूल टैग या बेहतर संरचना होने पर मैंने बहुत अधिक समय बिताया है, यह केक का एक टुकड़ा होगा। अफसोस की बात है कि मैं दस्तावेज़ डाउनलोड कर रहा हूं, और मैं समझ नहीं पा रहा हूं कि डेटा कैसे प्राप्त करें।XDocument

मैंने कुछ लिनक्स प्रश्नों और XElement का उपयोग एक इटरेटर के रूप में करने का प्रयास किया है। वैसे भी यहां संरचना का एक उदाहरण है।

<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:srch" xsi:schemaLocation="urn:yahoo:srch http://api.search.yahoo.com/SiteExplorerService/V1/InlinkDataResponse.xsd" totalResultsAvailable="247930100" firstResultPosition="99" totalResultsReturned="100"> 
<Result> 
    <Title>Adobe - Adobe Reader</Title> 
    <Url>http://get.adobe.com/fr/reader/</Url> 
    <ClickUrl>http://get.adobe.com/fr/reader/</ClickUrl> 
    </Result> 
<Result> 
    <Title>Religious Tolerance</Title> 
    <Url>http://www.religioustolerance.org/</Url> 
    <ClickUrl>http://www.religioustolerance.org/</ClickUrl> 
    </Result> 
<Result> 
    <Title>Applications Internet riches (RIA) | Adobe Flash Player</Title> 
    <Url>http://www.adobe.com/fr/products/flashplayer/</Url> 
    <ClickUrl>http://www.adobe.com/fr/products/flashplayer/</ClickUrl> 
    </Result> 
<Result> 
    <Title>photo management software | Adobe Photoshop Lightroom 3</Title> 
    <Url>http://www.adobe.com/products/photoshoplightroom/</Url> 
    <ClickUrl>http://www.adobe.com/products/photoshoplightroom/</ClickUrl> 
    </Result> 
<Result> 
    <Title>Battle for Wesnoth</Title> 
    <Url>http://www.wesnoth.org/</Url> 
    <ClickUrl>http://www.wesnoth.org/</ClickUrl> 
    </Result> 
</ResultSet> 

यहां एक नवीनतम स्निपेट का एक उदाहरण दिया गया है।

foreach (XElement ele in xDoc.Descendants("ResultSet").Elements("Result")) 
       { 
        CollectedUris.Add(ele.Element("Url").Value); 
       } 

उत्तर

8

आप एक XNamespace जोड़ने की आवश्यकता होगी:

XNamespace ns = "urn:yahoo:srch"; 

var query = xDoc.Root.Descendants(ns + "Result").Elements(ns + "Url") 

foreach(XElement e in query) 
{ 
    CollectedUris.Add(e.Value); 
} 

संपादित:
बोनस अंक के लिए एक LINQ समाधान:

xDoc.Root.Descendants(ns + "Result") 
    .Elements(ns + "Url") 
    .Select(x => x.Value).ToList() 
    .ForEach(CollectedUris.Add); 
+0

आह मुझे नामस्थानों के बारे में कोई जानकारी नहीं थी, निश्चित रूप से इसे किसी की मदद के बिना हल नहीं किया गया था, धन्यवाद! – Ash

2

मैं तुम्हें दस्तावेज़ में सभी<Url> तत्वों चाहते संभालने हूँ। यदि ऐसा है, तो आपका लूप लगभग वहां है। आप निम्नलिखित करना चाहते हैं।

using System.Xml.Linq; 

foreach (XElement ele in xDoc.Root.Descendants("Result").Descendants("Url") 
{ 
    CollectedUris.Add(ele.Value); 
} 

Root आप मूल तत्व के लिए एक संदर्भ हो जाता है, और निम्न Descendants बयान केवल <Result> नोड्स देता है। अंतिम Descendants कथन <Result> नोड एन्युमरेटर को केवल <Url> तत्वों को वापस करने के लिए बाध्य करता है।

+0

उदाहरण के लिए धन्यवाद, मैं एक्सएमएल नवीनीकृत किया है संरचना के रूप में यह पठनीय नहीं था। वैसे भी अजीब रूप से लूप के भीतर जोड़ें विधि को निकाल दिया नहीं जाता है (उस पर एक ब्रेक पॉइंट मिला) क्या आप संरचना की जांच कर सकते हैं और सुनिश्चित कर सकते हैं कि मैं कुछ गूंगा नहीं कर रहा हूं। धन्यवाद फिर से – Ash

+1

@ एश - मेरा समाधान देखें। यदि नामस्थान नहीं है तो स्टीव सही है, लेकिन आपके उदाहरण के लिए नामस्थान प्रबंधक की आवश्यकता है। –