Xercesc XPath функциональности - PullRequest
       32

Xercesc XPath функциональности

1 голос
/ 02 апреля 2012

Я устал от DOMDocument :: оценивать в xercesc 3.1.1, чтобы выбирать узлы из дерева DOM. Это работает для некоторых выражений xpath. Но выбор узлов по значению атрибута, например "// Project [@index = \" 1 \ "]", не поддерживается. Кто-нибудь может это подтвердить?

Спасибо!

Ответы [ 2 ]

1 голос
/ 13 августа 2014

Да, я могу подтвердить, что этот тип xpath expression не поддерживается в xerces 3.1.1.

В качестве примера, скажем, ваш XML выглядит как ...

<Root><Item>ABCD</Item><Item>EFGH</Item></Root>

... тогда следующий код выводит значение узлов Item:

DOMElement * lXMLDocumentElement(lXMLDocument->getDocumentElement());
if ( lXMLDocumentElement )
{
  try
  {
    DOMXPathResult * r(
      lXMLDocument->evaluate(L"Item", lXMLDocumentElement, NULL, DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE, NULL));

    if ( r )
    {
      for ( unsigned c(0); c < r->getSnapshotLength(); ++c )
      {
        r->snapshotItem(c);
        DOMNode * n(r->getNodeValue());

        if ( n->getNodeType() == DOMNode::ELEMENT_NODE )
        {
          DOMElement * e(static_cast<DOMElement *>(n));

          std::wcout << e->getTextContent() << std::endl;
        }
      }
    }
  }
  catch ( const DOMXPathException & e )
  {
    // handle exception
  }
}

однако, когда XML выглядит как

<Root><Project index="1">ABCD</Project><Project>EFGH</Project></Root>

и xpath expression

//Project[@index="1"]

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

Стоит также отметить, что метод evaluate() поддерживает только следующие значения параметра type (см. DOMXPathResultImpl.cpp)

ANY_UNORDERED_NODE_TYPE
FIRST_ORDERED_NODE_TYPE
UNORDERED_NODE_SNAPSHOT_TYPE
ORDERED_NODE_SNAPSHOT_TYPE
0 голосов
/ 02 апреля 2012

Когда я смотрю на документы DOMDocument класса , я не вижу evaluate() метода. Вы имеете в виду DOMXPathEvaluator :: оценивать?

Как правило, DOMXPathEvaluator::evaluate() - это , который должен поддерживать XPath (предположительно, по крайней мере, 1,0), поэтому выбор узлов по значению атрибута не должен быть проблемой.

Когда вы говорите «не поддерживается», вы имеете в виду, что вы пробовали выражение XPath, например "//Project[@index=\"1\"]", и оно не сработало? Если да, то как выглядел ваш код и каков был результат?

Какой ResultType вы просили? Как вы использовали полученные результаты? (Иногда возвращаются правильные результаты, но к ним нет правильного доступа.)

...