Como especificar o Namespace ao consultar o DOM com o XPath

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 294797
Sumário
Com o lançamento do Microsoft XML Parser (MSXML) 3.0, o XPath fornece uma maneira conveniente de consultar documentos XML e retornar um nó ou um nó definido. Quando você usa consulta XPath com os métodos selectSingleNode e selectNodes do objeto IXMLDOMNode , você deve usar nomes qualificados. Por exemplo, para selecionar o nó de catálogo com os seguintes dados XML
<?xml version ="1.0"?><a:Books xmlns:a="x-schema:bookschema.xml" ><a:Book>  <title>Presenting XML</title>  <author>Richard Light</author></a:Book></a:Books>				
se usarmos um como o alias do x-schema:bookschema.xml URI (Uniform Resource Identifier), a consulta XPath correspondente é o seguinte:
pXMLDoc->setProperty("SelectionNamespaces","xmlns:a='x-schema:bookschema.xml'");pXMLDoc->documentElement->selectNodes("/a:Books/a:Book");				
nesse caso, usando o nome qualificado é simples. Quando o namespace padrão é usado, no entanto, usando o nome qualificado pode ser mais difícil, como no exemplo a seguir:
<?xml version ="1.0"?><Books xmlns="x-schema:bookschema.xml" ><Book>  <title>Presenting XML</title>  <author>Richard Light</author></Book></Books>				
Observe que nenhum prefixo é usado nas marcas de nó. O nome qualificado ainda deve ser usado dentro de consulta XPath, caso contrário, a consulta (por exemplo, /Books/Book) não retorna nenhum resultado porque não há nenhum nó correspondente.
Mais Informações
O exemplo a seguir Visual C++ é fornecido para demonstrar a técnica.

Para especificar o espaço para nome quando você consulta o DOM com o XPath, siga estas etapas:
  1. Crie um projeto de console do Win32 e adicione um novo arquivo .cpp para o projeto. Cole o código a seguir no arquivo .cpp e nomeie o arquivo Test.cpp:
    #include <stdio.h>#import "msxml3.dll"using namespace MSXML2;void dump_com_error(_com_error &e);int main(int argc, char* argv[]){	CoInitialize(NULL);	try{		IXMLDOMDocument2Ptr pXMLDoc;		HRESULT hr = pXMLDoc.CreateInstance(__uuidof(DOMDocument));				pXMLDoc->async = false; // default - true,				pXMLDoc->validateOnParse = true;						hr = pXMLDoc->load("books.xml");			if(hr!=VARIANT_TRUE)		{			IXMLDOMParseErrorPtr  pError;						pError = pXMLDoc->parseError;			_bstr_t parseError =_bstr_t("At line ")+ _bstr_t(pError->Getline()) + _bstr_t("\n")+                            _bstr_t(pError->Getreason());			MessageBox(NULL,parseError, "Parse Error",MB_OK);			return -1;		}				hr = pXMLDoc->setProperty("SelectionLanguage", "XPath");		hr = pXMLDoc->setProperty("SelectionNamespaces", "xmlns:a='x-schema:bookschema.xml'");		IXMLDOMNodeListPtr pNodeList;		pNodeList = pXMLDoc->documentElement->selectNodes("/a:Books/a:Book");		int count = pNodeList->Getlength();		char pLength[64];		sprintf(pLength, "Total number of nodes selected is %d", count);		MessageBox(NULL,pLength,"Test", MB_OK);			}	catch(_com_error &e)	{		dump_com_error(e);		return -1;	}	return 0;}void dump_com_error(_com_error &e){	printf("Error\n");	printf("\a\tCode = %08lx\n", e.Error());	printf("\a\tCode meaning = %s", e.ErrorMessage());	_bstr_t bstrSource(e.Source());	_bstr_t bstrDescription(e.Description());	printf("\a\tSource = %s\n", (LPCSTR) bstrSource);	printf("\a\tDescription = %s\n", (LPCSTR) bstrDescription);}					
  2. Salve o seguinte XML como Books.XML na mesma pasta de projeto como Test.cpp.
    <?xml version ="1.0"?><Books xmlns="x-schema:bookschema.xml" ><Book>  <title>Presenting XML</title>  <author>Richard Light</author>  <pages>334</pages></Book><Book>  <title>Mastering XML</title>  <author>John Smith</author>  <pages>209</pages></Book></Books>					
  3. Salve o seguinte XML como Bookschema.xml na mesma pasta de projeto como Test.cpp.
    <?xml version="1.0"?><Schema xmlns="urn:schemas-microsoft-com:xml-data">  <ElementType name="title" />  <ElementType name="author" />  <ElementType name="pages" />  <ElementType name="Book" model="closed">    <element type="title" />    <element type="author" />    <element type="pages" />  </ElementType>  <ElementType name="Books" model="closed">    <element type="Book" />  </ElementType></Schema>					
  4. Compilar e executar o aplicativo. Uma caixa de mensagem mostra o número de nós que são retornados pela consulta do XPath.
Observe o seguinte:
  • O mesmo código de exemplo pode ser usado com um URI explícito como um espaço para nome.
  • Nas linhas a seguir
    IXMLDOMDocument2Ptr pXMLDoc;...hr = pXMLDoc->setProperty("SelectionLanguage", "XPath");hr = pXMLDoc->setProperty("SelectionNamespaces", "xmlns:a='x-schema:bookschema.xml'");...pNodeList = pXMLDoc->documentElement->selectNodes("/a:Books/a:Book");					
    o método setProperty não está disponível com a interface do IXMLDOMDocument .
Um nome qualificado (QName) é composto por um prefixo e uma parte local. O prefixo fornece o prefixo do nome qualificado e deve ser associado com um URI de espaço para nome.
Referências
Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
288147PROBLEMA: Usando XPath para consultas contra um Namespace padrão definido pelo usuário

Propriedades

ID do Artigo: 294797 - Última Revisão: 07/13/2004 15:47:07 - Revisão: 1.2

Microsoft XML Parser 3.0, Microsoft XML Parser 3.0 Service Pack 1, Microsoft XML Core Services 4.0

  • kbmt kbhowto KB294797 KbMtpt
Comentários