Pergunta

Estou apoiando um aplicativo C ++ herdado que usa Xerces-C para análise XML. Fui estragado pelo .NET e estou acostumado a usar o XPath para selecionar nós de uma árvore dom.

Existe alguma maneira de obter acesso a uma funcionalidade XPath limitada no Xerces-C? Estou procurando algo como SelectNodes ("/for/bar/baz"). Eu poderia fazer isso manualmente, mas o XPath é tão bom em comparação.

Foi útil?

Solução

Veja o Xerces FAQ.

http://xerces.apache.org/xerces-c/faq-other-2.html#faq-9

O Xerces-C ++ suporta xpath? No.xerces-c ++ 2.8.0 e xerces-c ++ 3.0.1 têm apenas implementação parcial do XPath para fins de manuseio de restrições de identidade do esquema. Para suporte completo ao XPath, você pode consultar o Apache Xalan C ++ ou outros projetos de código aberto como a Pathan.

É bastante fácil fazer o que você deseja usar Xalan.

Outras dicas

Aqui está um exemplo funcional de avaliação do XPath com Xerces 3.1.2.

Amostra xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <ApplicationSettings>hello world</ApplicationSettings>
</root>

C ++

#include <iostream>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <xercesc/util/TransService.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>

using namespace xercesc;
using namespace std;

int main()
{
  XMLPlatformUtils::Initialize();
  // create the DOM parser
  XercesDOMParser *parser = new XercesDOMParser;
  parser->setValidationScheme(XercesDOMParser::Val_Never);
  parser->parse("sample.xml");
  // get the DOM representation
  DOMDocument *doc = parser->getDocument();
  // get the root element
  DOMElement* root = doc->getDocumentElement();

  // evaluate the xpath
  DOMXPathResult* result=doc->evaluate(
      XMLString::transcode("/root/ApplicationSettings"),
      root,
      NULL,
      DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE,
      NULL);

  if (result->getNodeValue() == NULL)
  {
    cout << "There is no result for the provided XPath " << endl;
  }
  else
  {
    cout<<TranscodeToStr(result->getNodeValue()->getFirstChild()->getNodeValue(),"ascii").str()<<endl;
  }

  XMLPlatformUtils::Terminate();
  return 0;
}

Compilar e correr (assume a instalação padrão da biblioteca Xerces e o arquivo C ++ nomeado xpath.cpp)

g++ -g -Wall -pedantic -L/opt/lib -I/opt/include -DMAIN_TEST xpath.cpp -o xpath -lxerces-c
./xpath

Resultado

hello world

De acordo com Perguntas frequentes, Xerces-C suporta implementação parcial do XPath 1:

O mesmo mecanismo é disponibilizado através da API DomDocument :: Avaliar para permitir que o usuário execute consultas XPath simples envolvendo nós de domínio apenas, sem testes de predicado e permitir o operador "//" apenas como a etapa inicial.

Você usa DomDocument :: avaliar () para avaliar a expressão, que então retorna um DomxPathResult.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top