Você está offline; aguardando reconexão

PROBLEMA: MSXML 4.0: correspondência nós não são retornados ao executar consultas XPath contra documentos XML que especifica uma declaração de Namespace padrão

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: 313372
Sintomas
Quando você usa os métodos DOM (Document Object Model) do MSXML 4.0 ( selectNodes e selectSingleNode ) para executar consultas XPath em um documento XML que especifica um espaço para nome padrão declaração, o nó correspondente ou nós não são retornados.
Causa
A declaração de namespace padrão não é adicionada aos nomes de Namespace do objeto DOMDocument ou um prefixo de namespace não é especificado para a declaração de espaço para nome padrão quando ele é adicionado aos nomes de espaço para nome do objeto DOMDocument .
Resolução
Adicione a declaração de espaço para nome padrão dos nomes de espaço para nome do objeto DOMDocument especificando um prefixo de namespace. Para fazer isso, use o método setProperty do objeto DOMDocument para definir a propriedade interna SelectionNamespaces .
Situação
Esse comportamento é por design.
Mais Informações
MSXML 4.0 não suporta a linguagem de consulta XSLPattern . Ele oferece suporte somente a linguagem de consulta XPath . Isso implica que simples de estilo de árvore hierárquica consultas para acessar nós em um documento XML também são executadas como consultas XPath no MSXML 4.0. Quando você usa o MSXML 4.0 DOM para executar consultas XPath em um documento XML que especifica uma declaração de espaço para nome padrão, você deve usar o método setProperty do objeto DOMDocument para adicionar a declaração de espaço para nome padrão, especificando um prefixo de namespace, para os nomes de Namespace do objeto DOMDocument .

Etapas para reproduzir o problema

Para recriar o problema e testar a resolução especificada por meio de um projeto Visual Basic Standard EXE, execute estas etapas:
  1. No bloco de notas, criar um documento XML que contém o seguinte XML chamado Books.XML na pasta raiz da unidade C:
    <?xml version='1.0'?><Books xmlns="urn:books"><Book>  <Title>Beginning XML</Title>  <Publisher>Wrox</Publisher></Book><Book>  <Title>XML Step by Step</Title>  <Publisher>MSPress</Publisher></Book><Book>  <Title>Professional XML</Title>  <Publisher>Wrox</Publisher></Book><Book>  <Title>Developing XML solutions</Title>  <Publisher>MSPress</Publisher></Book></Books>					
  2. No Visual Basic, crie um novo projeto Standard EXE.
  3. Adicione uma referência para o Microsoft XML versão 4.0 .
  4. Arraste um botão de comando para Form1.
  5. Cole o seguinte código no procedimento de evento Click do botão de comando: Observação : este código carrega o documento de Books.XML exemplo em uma instância do objeto MSXML 4.0 DOMDocument40 . Em seguida, ele usa o método de DOM SelectNodes para executar uma consulta XPath contra o objeto DOMDocument40 para identificar os títulos que são publicados por MSPress.
    Dim xmldoc As MSXML2.DOMDocument40Dim bookList As MSXML2.IXMLDOMNodeListDim bookNode As MSXML2.IXMLDOMNodeSet xmldoc = New MSXML2.DOMDocument40'xmldoc.setProperty "SelectionNamespaces", "xmlns:bk='urn:books'"xmldoc.Load "c:\books.xml"Set bookList = xmldoc.selectNodes("//Publisher[. = 'MSPress']/parent::node()/Title")'Set bookList = xmldoc.selectNodes("//bk:Publisher[. = 'MSPress']/parent::node()/bk:Title")For Each bookNode In bookList Debug.Print "Title : " & bookNode.TextNext
  6. Salve e execute o projeto.
  7. Clique o botão de comando quando o formulário é exibido. Observe que, embora a consulta XPath é válida, ele não gera resultados e os títulos correspondentes não são gravados para a janela Verificação imediata do Visual Basic.
  8. Pare o projeto.
  9. Descomente a linha de código a seguir imediatamente após o Definir xmldoc = novo MSXML2.DOMDocument40 instrução para adicionar a declaração de espaço para nome padrão especificando um prefixo de namespace para os nomes de Namespace do objeto DOMDocument :
    'xmldoc.setProperty "SelectionNamespaces", "xmlns:bk='urn:books'"
  10. Comentário a chamada ao método selectNodes DOM que é usada para executar a consulta XPath.
    Set bookList = xmldoc.selectNodes("//Publisher[. = 'MSPress']/parent::node()/Title")					
  11. Descomente a instrução a seguir:
    'Set bookList = xmldoc.selectNodes("//bk:Publisher[. = 'MSPress']/parent::node()/bk:Title")
    Observe que os nomes de elemento são agora prefixados com o alias de namespace bk que você especificar quando a declaração de espaço para nome padrão é adicionada aos nomes de espaço para nome do objeto DOMDocument .

  12. Salve e execute o projeto. Clique o botão de comando quando o formulário é exibido. Observe que os nós correspondentes estão listados na janela Verificação imediata do Visual Basic.
Referências
Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
288913COMO: Usar XPath consultas em selectNodes do DOM MSXML método

Propriedades

ID do Artigo: 313372 - Última Revisão: 09/26/2005 19:41:05 - Revisão: 1.3

Microsoft XML Core Services 4.0

  • kbmt kbhotfixserver kbqfe kbprb KB313372 KbMtpt
Comentários
; guid; m.name = "ms.dqid"; document.getElementsByTagName("head")[0].appendChild(m);