Categorias
Como usar um módulo analisador de XML
eXtensible Markup Language (XML) é o padrão da indústria para a troca de informações. O XML permite aos usuários definir suas próprias etiquetas. Estas etiquetas são depois usadas para definir os dados. Por exemplo,
Um documento XML tem uma estrutura hierárquica. No topo, há um documento raiz seguido por outros nós, o que pode, por sua vez, ter mais nodos. Pode haver dados e atributos associados a estes nodos.
Os analisadores XML são ferramentas usadas para ler ou escrever em um documento XML. Estes analisadores se baseiam em padrões DOM (Document Object Model) ou SAX (Simple API for XML). A comparação entre os enfiques DOM e SAX é feita em muitos livros e em websites também.
Neste artigo, você vai aprender a ler e extrair informações de um documento XML em um aplicativo VC++. Assume-se que você tem experiência básica no uso do Microsoft Visual Studio 6.0 (MSIDE) para criar aplicativos VC++.
- Baixe o último MSXML SDK a partir de http://www.microsoft.com. Dê um clique duplo no instalador para instalar o SDK baixado. A instalação irá criar uma pasta começando com o MSXML em seu caminho configurado, como C: ou em C:\Arquivos de Programas. Esta pasta vai conter sub-pastas inc e lib, contendo bibliotecas e arquivos de cabeçalho necessários para o desenvolvimento de aplicativos. Além disso, msxmlX.dll, msxmlXr.dll -- onde X é a versão (a última sendo 6) -- serão copiados para o diretório C:\Windows\System32.
- Crie um novo projeto usando MSIDE. Pode ser de qualquer tipo - Aplicativo MFC, aplicativo Win32 Console, etc.
- Em seguida crie um arquivo cabeçalho e um arquivo fonte para colocar o seu código de analisador de XML.
- Incluir cabeçalhos e bibliotecas MSXML manualmente ou automaticamente. Manualmente isto pode ser feito através da adição do caminho de instalação e bibliotecas no âmbito das respetivas etiquetas do diálogo que se abre através do menu Configurações do Projeto do MSIDE. É melhor fazer isso automaticamente adicionando apenas as duas linhas de código seguintes em seu arquivo cabeçalho.
#importar <msxml6.dll> named_guids usando nome de espaço MSXML2; - Também, no seu arquivo cabeçalho coloque as seguintes declarações:
IXMLDOMDocumentPtr m_plDomDocument;
IXMLDOMElementPtr m_pDocRoot;
anular DisplayChildren(IXMLDOMNodePtr pParent);
anular DisplayChild(IXMLDOMNodePtr pChild);
anular DisplayAttributes(IXMLDOMNodePtr pChild,string parent,string &apname);
anular InitialiseXMLCOM(CString fomFileName);
bool carregado; - E desde que cada linha está sendo usada, adicione as linhas seguintes também em seu arquivo cabeçalho:
# inclua "string" usando namespace std; - Após estas configurações de projeto, você precisará escrever código para carregar um documento XML. O módulo Microsoft COM (Component Object Model) é utilizado. Embora eu esteja colocando comentários antes de usar a função COM, os leitores interessados podem consultar a documentação COM em outro lugar.
carraegado = verdadeiro;
//para inicialização do módulo COM
::CoInitialize(NULL);
//crie uma instância de documento XML
HRESULT hr = m_plDomDocument.CreateInstance(L"Msxml2.DOMDocument.6.0");
//verifique se a criação de uma instância falhou e exiba o erro antes de abortar
se (FALHADO(hr))
{
_com_error er(hr);
AfxMessageBox(er.ErrorMessage());
EndDialog(1);
}
// converta linha de nome de artigo xml para algo COM possa manusear (BSTR)
_bstr_t bstrFileName;
bstrFileName = strFileName.AllocSysString();
// chame a função de carga IXMLDOMDocumentPtr para carregar o documento XML
variant_t vResult;
vResult = m_plDomDocument->load(bstrFileName);
//se o carregamento é bem sucedido então obtenha o elemento raiz do documento
se (((bool)vResult) == VERDADEIRO) // sucesso!
{
// agora que o document está carregado, precisamos inicializar o indicador de raiz
m_pDocRoot = m_plDomDocument->documentElement;
//Seguindo a função recursivamente atravesse a árvore XML para crianças, e nós irmãos
DisplayChildren(m_pDocRoot);
}
também
{
AfxMessageBox("Documento FALHOU carregamento!");
} - Agora, é tempo de atravessar a árvore contida no documento XML. As seguintes funções fazem isso recursivamente.
anular DisplayChildren(IXMLDOMNodePtr pParent)
{
// exiba o nome do nó atual
DisplayChild(pParent);
// simples para loop obter todas as crianças
for (IXMLDOMNodePtr pChild = pParent->firstChild;
NULO != pChild;
pChild = pChild->nextSibling)
{
// para cada criança, chame esta função para obtermos
// as crianças deles também
DisplayChildren(pChild);
}
}
anular DisplayChild(IXMLDOMNodePtr pChild)
{
IXMLDOMElementPtr pElem1,pElem2;
string cIDs,apname;
//verificar se é um nó criança. Segunda condição exibe como você pode verificar nome do nó
if(NODE_ELEMENT == pChild->nodeType && (pChild->nodeName)==_bstr_t("Somename"))
{
HRESULT hr1 = pChild->QueryInterface(MSXML2::IID_IXMLDOMElement,(void **)&pElem1);
if(FAILED(hr1)) {_com_raise_error(hr1);}
cIDs = static_cast<string>((_bstr_t)(pElem1->getAttribute(_T("name"))));
//Processe todos os irmãos recursivamente e extraia seus atributos
para (IXMLDOMNodePtr pChild1 = pChild->firstChild ;
NULO != pChild1;
pChild1 = pChild1->nextSibling )
{
DisplayAttributes(pChild1,cIDs,apname);
}
}
} - Para cada nó, extraia os respetivos atributos. A seguinte função usa as mesmas chamadas que a função acima.
nulo DisplayAttributes(IXMLDOMNodePtr pChild, string cid, string &cIDs)
{
IXMLDOMElementPtr pElem;
if(NODE_ELEMENT == pChild->nodeType && (pChild->nodeName == _bstr_t("somename1")||pChild->nodeName == _bstr_t("attribute")))
{
HRESULT hr1 = pChild->QueryInterface(MSXML2::IID_IXMLDOMElement,(void **)&pElem);
if(FAILED(hr1)) {_com_raise_error(hr1);}
cIDs=static_cast<string>((_bstr_t)(pElem->getAttribute(_T("name"))));
}
também (//algumas condições diferentes como nome de nó diferente
{
}
} - Usuários interessados podem explorar criando DOM dinamicamente, consultando documento XML usando XPath, editando e salvando para documento XML.