c# - SOAP-Antwort mit LINQ to XML parsen-wie verschachtelte Knoten unter Eltern gelangen?



asp.net linq-to-xml (2)

Ich habe eine SOAP-Antwort, die ähnlich aussieht:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <getLoginResponse xmlns="http://<remotesite>/webservices">
        <person_id>123456</person_id>
        <person_name>John Doe</person_name>
    </getLoginResponse>
  </soapenv:Body>
</soapenv:Envelope>

Ich konnte erfolgreich den Knoten <get LoginResponse ...> mit dem folgenden LINQ-Code extrahieren:

string soapResult = rd.ReadToEnd();

XNamespace ns = "http://<remotesite>/webservices";

XDocument xDoc = XDocument.Parse(soapResult);

var respUser = (from r in xDoc.Descendants(ns + "getLoginResponse")
                select new User
                           {
                               Name = r.Element("person_name").Value
                           }).FirstOrDefault();

Der Aufruf von Name = r.Element("person_name").Value gibt mir Object reference not set to an instance of an object ist.

Ich habe weiter darüber nachgedacht und sehe, dass alle Werte (person_id, person_name) tatsächlich in der geschachtelten .Descendants().Descendants() XElement-Auflistung sind, wenn ich diese Abfrage ausfühle:

var respUser = (from r in xDoc.Descendants(ns + "getLoginResponse") 
                select r).Descendants().ToList();

Also, was dies mir sagt, ist in meiner ursprünglichen LINQ-Abfrage, ich extrahiere nicht die Knoten unter <getLoginResponse> richtig.

Wie kann ich dies kombinieren, indem ich ... select new User { ... } , um mein benutzerdefiniertes Objekt zu füllen?

Etwas tun wie:

var respUser = (from r in xDoc.Descendants(ns + "getLoginResponse").Descendants()
                select new User()
                              {
                                 Name = r.Element("person_name").Value
                              }).FirstOrDefault();

Funktioniert nicht sehr gut :)

Danke an alle für die Lösung - Ich habe den Namensraum aus den Kindelementen weggelassen, was mein Problem verursacht hat!

https://src-bin.com


Answer #1

Sie müssen Ihrer Abfrage einen gültigen Namespace hinzufügen, in Ihrem Beispiel also "http://foobar/webservices" , z. B .:

XElement xml = XElement.Load(@"testData.xml");
XNamespace foobar = "http://foobar/webservices";
string personId = xml.Descendants(foobar + "person_id").First().Value;

Answer #2

Sie müssen den Namespace einschließen:

r.Element(ns + "person_name").Value