2016-06-22 3 views
2

Учитывая XML:Как отличить атрибутов и узлов элементов вернулся из Saxon XPathSelector

<root name="value"> 
    <level1> 
    <level2>Text</level2> 
    </level1> 
</root> 

Я хочу XPath /root/@name вернуть value, и XPath /root/level1 вернуть XML сериализации <level1> узла:

<level1> 
    <level2>Text</level2> 
    </level1> 

Я использую интерфейс a9api от Saxon 9.6 в Java.

Я обнаружил, что могу позвонить XdmValue.toString(), чтобы получить сериализацию XML результата оценки XPath, которая получает желаемый результат для выбора элемента, но возвращает name="value" при выборе атрибута. И я могу позвонить XdmItem.getStringValue(), чтобы получить string value, что дает мне правильное значение для атрибута, но возвращает текстовое содержимое элемента.

Michael Kay ранее said "Saxon's s9api interface ... returns XdmValue objects whose type you can interrogate". Я могу видеть, что я могу выполнить проверку instanceof, чтобы определить, является ли она XdmAtomicValue, XdmExternalObject, XdmFunctionItem или XdmNode, но элементы и атрибуты являются экземплярами XdmNode. Как я различаю эти два?

(я не могу изменить XPaths, так как они предоставляются пользователем.)

ответ

3

я обнаружил ответ так же, как я закончил писать этот вопрос, поэтому я буду делить его на других.

После отливки XdmItem к XdmNode, вы можете вызвать XdmNode.getNodeKind(), который возвращает значение из перечисления XdmNodeKind указания, какой тип узла оно:

 XdmValue matchList = xPathSelector.evaluate(); 
     XdmItem firstItem = matchList.itemAt(0); 
     if (firstItem instanceof XdmNode) { 
      XdmNode xdmNode = (XdmNode) firstItem; 
      XdmNodeKind nodeKind = xdmNode.getNodeKind(); 
      if (nodeKind == XdmNodeKind.ELEMENT) { 
       return xdmNode.toString(); 
      } 
     } 
     return firstItem.getStringValue(); 
Смежные вопросы