3 Stimmen

Wie man XElement mit zwei Namensräumen abfragt

Ich versuche, den Innertextwert eines Elements mit LINQ-to-XML (einem XElement-Objekt) zu finden. Ich rufe meinen Service auf und erhalte eine XML-Antwort, die ich erfolgreich in ein XElement-Objekt geladen habe. Ich möchte den Innertext eines der Elemente extrahieren - aber jedes Mal, wenn ich dies versuche, bekomme ich ein null-Ergebnis.

Ich habe das Gefühl, dass mir etwas super Einfaches fehlt, aber ich bin ziemlich neu in LINQ-to-XML. Jede Hilfe wird geschätzt.

Ich versuche, den Innertextwert des Elements StatusInfo/Status zu erhalten. Hier ist mein zurückgegebenes XML-Dokument:

  Meine Antwort
  tag:foo.com,2012:/bar/06468dfc-32f7-4650-b765-608f2b852f22

    Meine Webdienste

  Meine Webdienste

    tag:foo.com,2012:/my-web-services

    <updated>2012-06-27T14:22:42Z</updated>
    <category term="tag:foo.com,2008/my/schemas#system" scheme="tag:foo.com,2008/my/schemas#type" />
    <content type="application/vnd.my.webservices+xml">
      <StatusInfo xmlns="tag:foo.com,2008:/my/data">
        <Status>Verfügbar</Status>  <!-- Ich möchte den Innertext -->
      </StatusInfo>
    </content>
  </entry>
</feed>
</code></pre>

<p>Hier ist ein Code-Schnipsel, den ich benutze, um den Wert zu extrahieren (der nicht funktioniert):</p>

<pre><code>    XElement root = XElement.Load(responseReader);
    XNamespace tag = "tag:foo.com,2008:/my/data";
    var status = (from s in root.Elements(tag + "Status")
                 select s).FirstOrDefault();
</code></pre>

<p>Meine <code>status</code>-Variable ist immer <code>null</code>. Ich habe mehrere Varianten davon ausprobiert, aber ohne Erfolg. Was mich verwirrt, ist der Namespace - <code>tag</code> und <code>2008</code> sind definiert. Ich weiß nicht, ob ich das richtig behandele oder ob es eine bessere Möglichkeit gibt, damit umzugehen.</p>

<p>Außerdem habe ich keine Kontrolle über das XML-Schema oder die Struktur des XML-Dokuments. Der Service, den ich verwende, ist außerhalb meiner Kontrolle.</p>

<p>Vielen Dank für jede Hilfe!</p></x-turndown>

2voto

Ed Power Punkte 7915

Versuchen Sie Descendants() anstelle von Elements():

XElement x = XElement.Load(responseReader);
XNamespace ns = "tag:foo.com,2008:/my/data";
var status = x.Descendants(ns + "Status").FirstOrDefault().Value;

0voto

Metro Smurf Punkte 35374

Es gibt 2 Namensräume im Feed:

  1. der Atom-Namensraum
  2. der Tag-Namensraum

Das äußere XML muss den Atom-Namensraum verwenden, während ein Teil des inneren XML den Tag-Namensraum verwenden muss. d.h.,

var doc = XDocument.Load(responseReader);
XNamespace nsAtom = "http://www.w3.org/2005/Atom";
XNamespace nsTag = "tag:foo.com,2008:/my/data";

// alle Eintragsknoten abrufen / Atom-Namensraum verwenden
var entry = doc.Root.Elements(nsAtom + "entry");

// alle StatusInfo-Elemente abrufen / Atom-Namensraum verwenden
var statusInfo = entry.Descendants(nsTag + "StatusInfo");

// alle Status abrufen / Tag-Namensraum verwenden
var status = statusInfo.Elements(nsTag + "Status");

// Wert aller Status abrufen
var values = status.Select(x => x.Value.ToString()).ToList();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X