Domanda

Così sto cercando di analizzare un file XML:

 <?xml version="1.0" encoding="utf-8" ?>
<Root>    
  <att1 name="bob" age="unspecified" xmlns="http://foo.co.uk/nan">    
  </att1>    
</Root>

utilizzando il seguente codice:

XElement xDoc= XElement.Load(filename);
var query = from c in xDoc.Descendants("att1").Attributes() select c;
foreach (XAttribute a in query)
{
    Console.WriteLine("{0}, {1}",a.Name,a.Value);
}

Nulla è scritto nella console a meno che non posso cancellare xmlns = "http://foo.co.uk/nan" dal file XML, dopo di che, ho un elenco di nomi e valori che ci si aspetterebbe di attributi, e come ho bisogno!

Modifica:. Formattazione

È stato utile?

Soluzione

Si deve utilizzare lo stesso spazio dei nomi nel codice:

XElement xDoc= XElement.Load(filename);
XNamespace ns = "http://foo.co.uk/nan";
var query = from c in xDoc.Descendants(ns + "att1").Attributes() select c;
foreach (XAttribute a in query)
{
    Console.WriteLine("{0}, {1}",a.Name,a.Value);
}

Gli attributi non alzare il (xmlns=....) spazio dei nomi predefinito, quindi non è necessario per qualificarsi. Il tag namespace (xmln:tags=....) è puramente locale per l'uso documento o API, i nomi sono davvero namespace + nome locale sempre in modo da avere sempre specificare lo spazio dei nomi.

Altri suggerimenti

La chiamata è l'esecuzione di query per un elemento denominato " ATT1" in nessun namespace.

Se hai chiamato Descendants("{http://foo.co.uk/nan}att1") è necessario selezionare l'elemento namespace, ma non il non-namespace elemento.

È possibile selezionare gli elementi denominati "ATT1" in qualsiasi o nessun namespace in questo modo:

var query = from c in xDoc.Descendants() where c.Name.LocalName == "att1" select c.Attributes;

È necessario specificare lo spazio dei nomi nella chiamata Descendants, in questo modo:

XNamespace ns = "http://foo.co.uk/nan";
foreach (XAttribute a in xDoc.Descendants(ns + "att1"))
{
    Console.WriteLine("{0}, {1}",a.Name,a.Value);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top