Seltsamkeit mit XDocument, XPath und Namespaces

8

Ich habe ein XML-Dokument, das so aussieht:

%Vor%

Es sind keine Schemas verfügbar, obwohl Namespaces angegeben sind (ich bekomme das von einer externen Quelle, also habe ich keine Kontrolle). Ich analysiere es mit einem XDocument, bekomme aber Nullen für die Elemente, die nicht im env-Namespace sind. Ich richte das XDocument so ein:

%Vor%

Dann versuche ich Werte zu erhalten:

? Source.XPathSelectElement ("// kmsg", oManager)

null

? Source.XPathSelectElement ("// header", oManager)

null

? Source.XPathSelectElement ("// env: source", oManager)

Ruft den Knoten richtig ab

Ich gehe davon aus, dass dies etwas damit zu tun hat, dass ich den Namespace-Manager falsch eingerichtet habe, aber ich kann nicht herausfinden, wie ich ihn beheben kann. Jede Hilfe wäre großartig.

Danke

    
Chris Surfleet 15.09.2010, 08:34
quelle

2 Antworten

16

Zusätzlich zu der korrekten Bemerkung von @ Mads-Hansen haben Sie das typische Problem, dass Sie für einen der Namespaces kein (nicht leeres) Präfix definieren.

Remember : XPath betrachtet jeden Namen ohne Präfix als "keinen Namespace".

Daher ist das falsch :

%Vor%

Dieser XPath-Ausdruck möchte alle kmsg -Elemente auswählen, die sich in "no namespace" befinden, und er wählt nichts korrekt aus, weil alle kmsg -Elemente im bereitgestellten XML-Dokument im Namespace "http://url1" und nicht in " kein Namespace ".

Um es richtig zu machen :

%Vor%     
Dimitre Novatchev 15.09.2010, 13:17
quelle
0

Die Namespace-URIs, die in Ihrer Quell-XML deklariert sind, stimmen nicht mit den Namespace-URIs überein, die Sie bei Ihrer XmlNamespaceManager registrieren.

In Ihrer Quell-XML:

  1. Der anonyme Namespace (kein Präfix) hat den Namespace-uri: http://url1
  2. Das Namespace-Präfix env hat den Namespace-uri: url1

In deinem XmlNamespaceManager hast du erklärt:

  1. Der anonyme Namespace (kein Präfix) hat den Namespace-uri: http://xml.kerridge.net/k8msg
  2. Das Namespace-Präfix env hat den Namespace-uri: http://xml.kerridge.net/k8msgEnvelope

Die Namespace-Uri-Werte müssen übereinstimmen, andernfalls wählen Sie verschiedene Elementnamen und erhalten nie eine Übereinstimmung.

    
Mads Hansen 15.09.2010 11:24
quelle