2012-01-10 7 views
6

Я пытаюсь определить правильное выражение XPath, чтобы вернуть значение атрибута xsi:type в элементе Body. Я пробовал то, что кажется всем без везения. Основываясь на том, что я читал, это кажется близким, но, очевидно, это не правильно. Любое быстрое руководство, чтобы я мог наконец отдохнуть?Получить значение xsi: type with xpath

//v20:Body/@xsi:type 

Я хочу, чтобы вернуть v20:SmsMessageV1RequestBody

<v20:MessageV1Request> 
    <v20:Header> 
     <v20:Source> 
      <v20:Name>SOURCE_APP</v20:Name> 
      <v20:ReferenceId>1326236916621</v20:ReferenceId> 
      <v20:Principal>2001</v20:Principal> 
     </v20:Source> 
    </v20:Header> 
    <v20:Body xsi:type="v20:SmsMessageV1RequestBody"> 
     <v20:ToAddress>5555551212</v20:ToAddress> 
     <v20:FromAddress>11111</v20:FromAddress> 
     <v20:Message>TEST</v20:Message> 
    </v20:Body> 
</v20:MessageV1Request> 
+4

Выражение Xpath выглядит хорошо для меня. Вы используете этот XPath в XQUERY, XSLT или что-то еще? Наиболее вероятной причиной проблемы здесь является путаница, вызванная префиксами пространства имен. Один из способов устранить пространства имен в качестве источника путаницы - это переписать xpath как это: // * [local-name() eq 'Body']/@ * [local-name() eq 'type'] –

+0

Мюррей прав , поскольку в XPath обычно существуют два способа работы с пространствами имен: во-первых: использование функций 'local-name()' и 'namespace-uri()' XPath, во-вторых: использование правильных механизмов механизма XPath - например для стандартного JAXP вы должны использовать правильно сконфигурированное пространство имен, которое отображает префиксы в пространства имен. –

ответ

2

Как было отмечено в комментариях, у вас есть два варианта:

  1. Использование local-name() для ссылки на целевые узлы без учета пространства имен
  2. Правильно зарегистрируйте все пространства имен с помощью механизма XPath

Вот как сделать последний в Java:

XPath xpath = XPathFactory.newInstance().newXPath(); 
NamespaceContext ctx = new NamespaceContext() { 
    public String getNamespaceURI(String prefix) { 
     if ("v20".equals(prefix)) { 
      return "testNS1"; 
     } else if ("xsi".equals(prefix)) { 
      return "http://www.w3.org/2001/XMLSchema-instance"; 
     } 
     return null; 
    } 
    public String getPrefix(String uri) { 
     throw new UnsupportedOperationException(); 
    } 
    public Iterator getPrefixes(String uri) { 
     throw new UnsupportedOperationException(); 
    } 
}; 
xpath.setNamespaceContext(ctx); 
XPathExpression expr = xpath.compile("//v20:Body/@xsi:type");  
System.out.println(expr.evaluate(doc, XPathConstants.STRING)); 

Обратите внимание, что я предполагаю, что следующие объявления пространств имен:

<v20:MessageV1Request xmlns:v20="testNS1" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

Вам нужно обновить getNamespaceURI использовать фактические значения.

0

Все замечательные ответы/обратная связь. Моя фактическая проблема, похоже, разрешила себя ночью и свежей сборкой по утрам. Я буду улучшать с обратной связью. Спасибо всем.

Смежные вопросы