2011-02-14 22 views
22

Estoy intentando iterar a través de los nodos de mi documento xml para obtener el valor de <username>Ed</username> en cada nodo. Estoy usando Linq para ordenar el XDocument primero, y luego intentar recorrer los nodos. Parece que no puedo encontrar el ciclo foreach correcto para lograr esto. Cualquier ayuda es apreciada.Cómo iterar a través de los nodos de XDocument

var doc = XDocument.Load("files\\config.xml"); 
var newDoc = new XDocument(new XElement("Config", 
      from p in doc.Element("Config").Elements("Profile") 
      orderby int.Parse(p.Element("order").Value) 
      select p)); 


foreach (XElement xe in newDoc.Nodes()) 
{ 
    MessageBox.Show(xe.Element("username").Value); 
} 

// XML document 
<Config> 
<Profile> 
    <id>Scope</id> 
    <username>Scope 1</username> 
    <password>...</password> 
    <cdkey>0000</cdkey> 
    <expkey></expkey> 
    <cdkeyowner>Scope</cdkeyowner> 
    <client>W2BN</client> 
    <server>[IP]</server> 
    <homechannel>Lobby</homechannel> 
    <load>1</load> 
    <order>2</order> 
</Profile> 
<Profile> 
    <id>Scope 2</id> 
    <username>Scope 2</username> 
    <password>...</password> 
    <cdkey>0000</cdkey> 
    <expkey></expkey> 
    <cdkeyowner>Scope</cdkeyowner> 
    <client>W2BN</client> 
    <server>[IP]</server> 
    <homechannel>Lobby</homechannel> 
    <load>1</load> 
    <order>1</order> 
</Profile> 
</Config> 
+0

Se puede publicar su esquema (abreviada), o presentar una (abreviada) ejemplo? –

+0

seguro, 'code' Ed Ed 2 ' code' –

+0

Usted debe ser capaz de poner un punto de interrupción aquí, ejecute en modo de depuración, y luego inspeccionar el 'newDoc 'objeto para determinar las propiedades XML correctas para consultar. –

Respuesta

39

Pruebe esto. No estoy seguro de por qué necesita el segundo documento.

foreach (XElement xe in doc.Descendants("Profile")) 
{ 
    MessageBox.Show(xe.Element("username").Value); 
} 
+0

el 2do documento es para ordenar el primero por' código' en mi esquema Simplemente no lo incluí. Esto funciona, pero ¿hay alguna manera de iterar cada nodo y obtener el valor para todos los elementos en el nodo? (Mi esquema se acorta, cada nodo tiene alrededor de 10 elementos a los que necesito acceder) –

+0

publica el esquema completo, o lo que sea relevante. De lo contrario, es difícil adivinar lo que intentas lograr –

+0

publicado el esquema completo. Básicamente tengo que recorrer cada nodo 'code' y obtener el valor para cada elemento dentro de él. –

4

Es más fácil usar un XPathDocument y una expresión XPath.

var doc = new XPathDocument("files\\config.xml") 
foreach (var username in doc.CreateNavigator().Select("//username") 
{ 
    ... 
} 
0

Si está buscando un nodo interno, es decir, recursivo, puede verificar que el elemento tenga un elemento. Por ejemplo ASSUM que la lectura de su base de datos XML desde

string xmlRoot = "select XmlItem from db"; 
XDocument doc = XDocument.Parse(xmlRoot); 
List<XElement> xElementList = doc.Descendants().Tolist(); 
foreach(XElement element in xElementList) 
{ 
    // read the element and do with your node 
    if(element.HasElements) 
    { 
     // here you can reach nested node 
    } 

} 
Cuestiones relacionadas