2010-08-11 17 views
5

Realmente no quería pedir ayuda, ya que sé que eventualmente lo resolveré, pero he pasado demasiado tiempo, si el documento tenía etiquetas principales o una mejor estructura, Sería un pedazo de pastel. Tristemente estoy descargando el documento, y simplemente no puedo entender cómo obtener la información.Seleccionar un XElement de un XDocument

He intentado algunas consultas linq y un foreach utilizando XElement como un iterador. De todos modos aquí hay un ejemplo de la estructura.

<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> 

Aquí hay un ejemplo de un último fragmento.

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

Respuesta

8

Usted tendrá que añadir un 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); 
} 

Editar:
Una solución LINQ de puntos de bonificación:

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

Ah, no tenía ni idea de los espacios de nombres, sin duda no lo habría resuelto sin la ayuda de alguien, ¡gracias! – Ash

2

Estoy asumiendo que usted quiere todos<Url> elementos del documento. Si ese es el caso, entonces su bucle casi está allí. Querrá hacer lo siguiente.

using System.Xml.Linq; 

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

Root se obtiene una referencia al elemento raíz, y la instrucción que sigue Descendants devuelve sólo los nodos <Result>. La última instrucción Descendants restringe aún más el enumerador de nodos <Result> para que solo devuelva elementos <Url>.

+0

Gracias por el ejemplo, he actualizado la xml estructura porque no era legible De todos modos, extrañamente, el método Agregar dentro del ciclo no se activa (tiene un punto de quiebre). ¿Podrían ver la estructura y asegurarse de que no estoy haciendo una tontería? Gracias de nuevo – Ash

+1

@Ash - ver mi solución. Steve es correcto si no hay un espacio de nombres, pero su ejemplo requiere un administrador de espacio de nombres. –

Cuestiones relacionadas