Frage

Also ich versuche, eine XML-Datei zu analysieren:

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

Mit dem folgenden Code:

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);
}

Es wird nichts auf die Konsole geschrieben, es sei denn ich xmlns = „http://foo.co.uk/nan“ aus der XML-Datei löschen, wonach ich eine Liste von Attributnamen und Werten erhalten, wie man erwarten würde, und wie ich brauche!

Edit:. Formatierung

War es hilfreich?

Lösung

Sie haben den gleichen Namensraum in Ihrem Code verwenden:

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);
}

Attribute nicht abholen den Standard (xmlns=....) Namespace, so dass Sie sie nicht qualifizieren müssen. Der Namespace-Tag (xmln:tags=....) rein lokal auf das Dokument oder API verwendet wird, sind die Namen wirklich Namespace + lokale Namen immer so muss man immer den Namensraum angeben.

Andere Tipps

Ihr Aufruf an Nachkommen für ein Element abfragt dem Namen " att1" in keinem Namespace.

Wenn Sie genannt Descendants("{http://foo.co.uk/nan}att1") Sie die Namespace-Element wählen würde, aber nicht das Nicht-Namespace-Element.

Sie können Elemente auswählen, den Namen „att1“ in einem oder keinen Namensraum wie folgt:

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

Sie müssen den Namespace im Descendants Aufruf angeben, wie folgt aus:

XNamespace ns = "http://foo.co.uk/nan";
foreach (XAttribute a in xDoc.Descendants(ns + "att1"))
{
    Console.WriteLine("{0}, {1}",a.Name,a.Value);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top