2010-09-27 26 views
7

Estoy tratando de usar una expresión xpath para seleccionar un conjunto de nodos en un documento xml con diferentes espacios de nombres definidos.Problema al ejecutar la consulta xpath con espacios de nombres

El XML es como la siguiente:

<?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>... 

Quiero seleccionar sólo -nodes "MSG" que tiene el niño "OrderStatus" y por lo tanto quiero usar la siguiente expresión XPath:/msg [recuento ('OrderStatus') > 0] pero esto no funcionará ya que recibo un mensaje de error que dice: "Namespace Manager o XsltContext necesarios. Esta consulta tiene un prefijo, variable o función definida por el usuario".

Así que creo que quiero usar una expresión que se parece a esto:/* [local-name() = 'Msg'] [count ('OrderStatus') > 0] pero eso no parece funcionar .. ¿algunas ideas?

Br,

Andreas

Respuesta

10

Quiero usar la siguiente expresión XPath :

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

pero esto no va a funcionar desde que sale un mensaje de error que dice: "Namespace Manager o XsltContext necesarios.

Preguntas más frecuentes.

En XPath siempre se considera que un nombre no prefijado pertenece a "sin espacio de nombres".

Sin embargo, los elementos que desea seleccionar están, de hecho, en el espacio de nombre "http://www.noventus.se/epix1/genericheader.xsd" .

Tienes dos maneras posibles para escribir su expresión XPath:

  1. utilizar las instalaciones de la lengua de alojamiento para asociar a todos los prefijos de espacios de nombres diferentes a las que pertenecen los nombres de la expresión. No ha indicado cuál es el idioma de alojamiento en este caso concreto, así que no puedo ayudarlo con esto. Se puede encontrar un ejemplo de C# here.

Si ha asociado el prefijo "xxx" al espacio de nombres "http://www.noventus.se/epix1/genericheader.xsd" y el prefijo "yyy" al espacio de nombres "http://www.noventus.se/epix1/orderstatus.xsd", entonces su expresión se puede escribir como:

/xxx:Msg[yyy:OrderStatus]

: 2: Si no' Si desea utilizar cualquier prefijo en absoluto, aún se puede construir una expresión XPath, sin embargo, no será demasiado legible:

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

Por último, hacer notar:

  1. Con el fin de probar si un elemento x tiene un niño y no es necesario para comprobar si una positiva count(y). Sólo tiene que utilizar: x[y]

  2. posiciones Xpath son 1-basado. Esto significa que NodeSetExpression[0] nunca selecciona un nodo. Usted quiere: NodeSetExpression[1]

Cuestiones relacionadas