xpath, чтобы получить всю структуру дерева XML - PullRequest
4 голосов
/ 13 января 2012

Есть ли способ использовать xpath для получения всей древовидной структуры. Например, скажем, что это xml

<a>
   <b>
      <c>
         data
      </c>
   </b>
</a>

Я бы хотел, чтобы xpath поднял все содержимое узла, и результат должен быть

  <b>
     <c>
        data
     </c>
  </b>

До сих пор я использовал VTD-XML и java для получения элементов. Это код, который я использовал.

    VTDGen vg = new VTDGen();
    vg.setDoc(xmlString);
    vg.parse(true);
    VTDNav vn = vg.getNav();
    AutoPilot ap = new AutoPilot(vn);
    ap.selectXPath(xPath);
    String data = ap.evalXPathToString();

Ответы [ 4 ]

3 голосов
/ 13 января 2012

Используйте

/*/node()

Это выбирает все дочерние узлы верхнего элемента XML-документа. Множество всех этих узлов имеет в точности желаемую структуру поддерева, потому что каждый выбранный элемент сохраняет все свое поддерево (из которых этот элемент является верхним узлом).

Проверка на основе XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select="/*/node()"/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному документу XML :

<a>
  <b>
     <c>
      data
     </c>
  </b>
</a>

вычисляется выражение XPath, и выбранные узлы выводятся, давая требуемый, правильный результат :

<b>
   <c>
      data
     </c>
</b>
3 голосов
/ 13 января 2012

Помните, что XPath выбирает узел или набор узлов. Думайте об этом как о возвращении указателей в ваше исходное дерево. Он не возвращает «всю древовидную структуру», он возвращает указатели на выбранные узлы в этой структуре. Что бы вы ни выбрали, вся структура доступна вашей программе путем перехода от выбранных узлов к другим. Эта навигация может быть выполнена с использованием дополнительных выражений XPath, или с использованием DOM-подобного навигационного API, или неявно с помощью таких операций, как сериализация (обычно, когда вы сериализуете узел, он показывает целое поддерево с корнем в этом узле).

2 голосов
/ 13 января 2012

В идеале, "// b" выбирает узлы в документе из текущего узла, которые соответствуют выбору.

1 голос
/ 29 ноября 2013

Использование

/descendant-or-self::node()
...