Как получить содержимое w: t, предоставившее дочерний элемент w: p в xml, используя xpath

#java #xml #xpath #openxml #domparser

#java #xml #xpath #openxml #domparser

Вопрос:

Мне нужно проверить, есть ли в дочернем элементе w: p тег w: t. w: p может иметь дочерние элементы w: r, w: hyperlink, w: fldSimple и т.д.

 <w:r>
   <w:t>
   a link 
   <w:t/>
</w:r>
<w:hyperlink r:id="rId4">
   <w:r>
      <w:rPr>
         <w:rStyle w:val="Hyperlink"/>
      </w:rPr>
      <w:t>Google</w:t>
   </w:r>
</w:hyperlink>
  

если дочерним элементом w: p является w: r, то у него будет тег w: t сразу на следующем уровне, но если дочерним элементом w: p является w: hyperlink, то w: t не будет непосредственным дочерним элементом w: hyperlink.

Запрос x: path, который я написал, является

 Node tNode = (Node) xPath.evaluate("//t", pChildNode, XPathConstants.NODE);
  

где pChildNode может использовать w: r, w: hyperlink или любые другие допустимые дочерние элементы w: p

Но этот запрос xpath не извлекает мой w: t-узел из дочерних элементов w: p

Ответ №1:

Вы не использовали никаких пространств имен.

 Node tNode = (Node) xPath.evaluate("//w:t", pChildNode, XPathConstants.NODE);
  

Перед выполнением этого вы должны связать правильное пространство имен с помощью NamespaceContext :

 xpath.setNamespaceContext(new NamespaceContext() {
    @Override
    public Iterator getPrefixes(String arg0) {
        return null;
    }

    @Override
    public String getPrefix(String arg0) {
        return null;
    }

    @Override
    public String getNamespaceURI(String arg0) {
        if("w".equals(arg0)) {
            return "YOUR-NAMESPACE";
        }
        return null;
    }
});