2010-09-27 7 views
7

Próbuję użyć wyrażenia xpath do wybrania zestawu węzłów w dokumencie XML z określonymi różnymi przestrzeniami nazw.Problem z uruchomieniem zapytania xpath z przestrzeniami nazw

xml wygląda mniej więcej tak:

<?POSTEN SND="SE00317644000" REC="5566420989" MSGTYPE="EPIX"?> 
<ns:Msg xmlns:ns="http://www.noventus.se/epix1/genericheader.xsd"> 
    <GenericHeader> 
    <SubsysId>1</SubsysId> 
    <SubsysType>30003</SubsysType> 
    <SendDateTime>2009-08-13T14:28:15</SendDateTime> 
    </GenericHeader> 
    <m:OrderStatus xmlns:m="http://www.noventus.se/epix1/orderstatus.xsd"> 
    <Header> 
     <OrderSystemId>Soda SE</OrderSystemId> 
     <OrderNo>20090811</OrderNo> 
     <Status>0</Status> 
    </Header> 
    <Lines>... 

Chcę wybrać tylko "msg" -nodes który ma dziecko "OrderStatus" i dlatego chcę użyć następującego wyrażenia XPath:/msg [count ('OrderStatus') > 0] ale to nie zadziała, ponieważ dostaję komunikat o błędzie z informacją: "Namespace Manager lub XsltContext potrzebne.To zapytanie ma prefiks, zmienną lub funkcję zdefiniowaną przez użytkownika".

Więc myślę, że chcę użyć wyrażenia, które wygląda mniej więcej tak:/* [local-name() = 'Msg'] [count ('OrderStatus') > 0] ale to nie wydaje się działać .. jakieś pomysły?

Br

Andreas

Odpowiedz

10

chcę użyć następującego xpath wyrażenie:

/Msg[count('OrderStatus')[ 0] 

ale to nie będzie działać, ponieważ otrzymuję komunikat o błędzie z informacją: "NamespacePotrzebne 210 Menedżer lub XsltContext.

To jest najczęściej zadawane pytania.

W XPath niepoprawiona nazwa zawsze uważana jest za "bez przestrzeni nazw".

Jednak elementy, które chcesz wybrać, są w rzeczywistości w przestrzeni nazw "http://www.noventus.se/epix1/genericheader.xsd" .

Masz dwa możliwe sposoby, aby napisać wyrażenie XPath:

  1. korzystać z udogodnień języku hostingu skojarzyć przedrostki do wszystkich różnych nazw, do których nazwy z wyrażenia należą. W tym konkretnym przypadku nie wskazałeś, jaki jest język hostingu, więc nie mogę ci w tym pomóc. Przykład C# można znaleźć here.

Jeśli związane prefiks "xxx" do nazw "http://www.noventus.se/epix1/genericheader.xsd" i prefiksu "yyy" do nazw "http://www.noventus.se/epix1/orderstatus.xsd", wówczas wyrażenie może być zapisane jako:

/xxx:Msg[yyy:OrderStatus]

: 2: Jeśli don” t chcesz użyć jakichkolwiek prefiksów, ekspres XPath wciąż może być skonstruowany, ale nie będzie czytelny:

/*[local-name() = 'Msg' and *[local-name() = 'OrderStatus']]

Wreszcie, należy pamiętać:

  1. W celu sprawdzenia, czy element x ma dziecko y nie jest konieczne, aby przetestować na pozytywną count(y). Wystarczy użyć: x[y]

  2. Pozycje 1 XPath są oparte. Oznacza to, że NodeSetExpression[0] nigdy nie wybiera węzła. Chcesz: NodeSetExpression[1]

Powiązane problemy