5 Stimmen

Ist dies der effizienteste Weg, um diese XDocument-Abfrage auszudrücken?

Wir nutzen einen Webdienst eines Drittanbieters, der XML zurückgibt, das ungefähr so aussieht (aus Gründen der Kürze gekürzt):

      L

      MRDEN

      G

      1235

          -u@surfuk1

      1236

          -u@surfuk2

      1237

          -u@surfuk3

Für einen bestimmten Produktcode muss ich den realm-Namen erhalten, d.h. den inneren Text von:

-u@surfuk2

Weil jeder Elementname entweder oder ist, ist es etwas umständlich mit Linq to XML oder Abfrageausdrücken zu parsen.

Ist der folgende Weg der effektivste/effizienteste/ausdrucksstärkste Weg, um den Realnamen für ein bestimmtes Produkt, z.B. 1235, zu erhalten:

List products = response
    .Element("Response")
    .Elements("block")
    .Where(x => x.Attribute("name").Value == "products")
    .Elements("block").ToList();
//
// Ich habe die Abfrage aufgeteilt, um die Lesbarkeit zu erleichtern
//
string realm = products.Elements("a")
    .Where(x => x.Attribute("name").Value == "product-id")
    .Where(y => y.Value == "1235") // für beispielhafte Verwendung fest codiert
    .Ancestors()
    .First()
    .Elements("block")
    .Where(z => z.Attribute("name").Value == "realms")
    .Elements("block")
    .Elements("a")
    .First().Value;

2voto

Dimitre Novatchev Punkte 234995

Die Definition von realm lautet:

string realm = (string) products.XPathEvaluate(
   "string(
      /*/blocks[@name='products']
                 /*/a[@name='product-id' and . = '1236']
                              /following-sibling::block[1]
          )
   "
                                     )

Tatsächlich ist dies sowohl lesbarer als auch kompakter als die Definition von realm in der Originalfrage.

In Bezug auf die Effizienz könnte es gut sein, dass das Auswerten eines einzigen XPath-Ausdrucks ebenfalls effizienter ist, jedoch müssen wir eine Anwendung schreiben, die die Laufzeiten der beiden Methoden vergleicht, um festzustellen, ob dies zutrifft.

0voto

configurator Punkte 39516

Es scheint so, aber warum brauchen Sie alle Anrufe von ToList()? Ich sehe drei dieser Aufrufe und ich denke nicht, dass sie benötigt werden, also verlangsamen sie einfach Ihren Code. Aber andererseits habe ich nicht viel Linq-to-Xml verwendet.

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