ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Problema para ler um arquivo xml (Editado)

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
rafaelralfi
Novato
Novato


Registrado: Sexta-Feira, 17 de Outubro de 2008
Mensagens: 98

MensagemEnviada: Ter Abr 14, 2009 5:04 pm    Assunto: Problema para ler um arquivo xml (Editado) Responder com Citação

Pessoal estou com um problema para ler um arquivo xml

quando tento aprofundar na hierarquia de nodes ele começa a dar AccesViolation

por exemplo numa hierarquia
NoPrincipal>NoPai>NoFilho>NoFilhodoFilho

só consigo acessar ató o nó Pai após só da erros;

Este é o Codigo que estou utilizando
XMLDocument1.ChildNodes.FindNode('NoPai').ChildNodes.FindNode('NoFilho').ChildNodes.FindNode('NoFilhoDoFilho').Attributes['ID'];
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
solitary_knight
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 26 de Janeiro de 2006
Mensagens: 277

MensagemEnviada: Ter Abr 14, 2009 5:08 pm    Assunto: Responder com Citação

XMLDocument1.DocumentElement.ChildNodes.Nodes['NodeName'].Attributes['AttributeName']
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rafaelralfi
Novato
Novato


Registrado: Sexta-Feira, 17 de Outubro de 2008
Mensagens: 98

MensagemEnviada: Ter Abr 14, 2009 5:28 pm    Assunto: ... Responder com Citação

Desculpe acho que me expressei mal eu quero pegar o atributo do Ultimo elemento no caso do nó filho do filho, mas não consigo dexer na hierarquia pois quando tendo acessas nós abaixo do nó pai tenho problemas de acces violation;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
solitary_knight
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 26 de Janeiro de 2006
Mensagens: 277

MensagemEnviada: Ter Abr 14, 2009 5:39 pm    Assunto: Responder com Citação

posta o xml ai, pq consiguo pegar assim do jeito que postei.


XMLDocument1.DocumentElement.ChildNodes.Nodes['NodeName'].ChildNodes.Nodes['NodeName'].Attributes['AttributeName']

assim por diante, quanto filhos tiver.
claro que se houver mais de um node com o mesmo nome ele pega o primeiro. ai teria que fazer um for no ChildNodes.Count pra pegar outro.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rafaelralfi
Novato
Novato


Registrado: Sexta-Feira, 17 de Outubro de 2008
Mensagens: 98

MensagemEnviada: Qua Abr 15, 2009 8:06 am    Assunto: XML Responder com Citação

<?xml version="1.0" standalone="yes" ?>
<DBMODEL Version="4.0">
<SETTINGS>
<DATATYPES>
<DATATYPE ID="1" IDGroup="0" TypeName="TINYINT" Description="A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255." ParamCount="1" OptionCount="2" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
<OPTIONS>
<OPTION Name="UNSIGNED" Default="1" />
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>



Dentro de SETTINGS>DATATYPES>DATATYPE quero os atributos do tipo de dados (Atributo 'ID'...'TypeName')


Obrigado...
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rafaelralfi
Novato
Novato


Registrado: Sexta-Feira, 17 de Outubro de 2008
Mensagens: 98

MensagemEnviada: Qua Abr 15, 2009 8:28 am    Assunto: XML... Responder com Citação

mais um detalhe

no seguinte código

var
xml : TXmlDocument;
no, no1,no2,no3,no4 : IXMLNODE;
begin
xml := TXmlDocument.Create(Self);
xml.LoadFromFile('c:\Arquivo.xml');
no := xml.ChildNodes.FindNode('SETTINGS');
no1 := no.ChildNodes.FindNode('DATATYPES'); //Aqui dá acces violation
no2 := no1.ChildNodes.First;
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
DonOctavioDelFlores
Colaborador
Colaborador


Registrado: Quarta-Feira, 12 de Setembro de 2007
Mensagens: 2630
Localização: Pra lá de Bagda

MensagemEnviada: Qua Abr 15, 2009 2:06 pm    Assunto: Responder com Citação

sabe debugar?

dá access violation pq o valor do obj é nil...

e o valor fica nil quando a funcao FindNode não encontrou nada...

isso quer dizer que.........
_________________
“The problem with the world is that everyone is a few drinks behind.” Humphrey Bogart
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qua Abr 15, 2009 3:01 pm    Assunto: Responder com Citação

Bem amigo veja se isto te serve, faz parte de um estudo de caso que fiz a algum tempo:

Código:

procedure TForm1.DomToTree (XmlNode: IXMLNode; TreeNode: TTreeNode);
var
  I: Integer;
  NewTreeNode: TTreeNode;
  NodeText: string;
  AttrNode: IXMLNode;
begin
  // skip text nodes and other special cases
  if not (XmlNode.NodeType = ntElement) then
    Exit;
  // add the node itself
  NodeText := XmlNode.NodeName;
  if XmlNode.IsTextElement then
    NodeText := NodeText + ' = ' + XmlNode.NodeValue;
  NewTreeNode := TreeView1.Items.AddChild(TreeNode, NodeText);
  // add attributes
  for I := 0 to xmlNode.AttributeNodes.Count - 1 do
  begin
    AttrNode := xmlNode.AttributeNodes.Nodes[I];
    TreeView1.Items.AddChild(NewTreeNode,
      '[' + AttrNode.NodeName + ' = "' + AttrNode.Text + '"]');
  end;
  // add each child node
  if XmlNode.HasChildNodes then
    for I := 0 to xmlNode.ChildNodes.Count - 1 do
      DomToTree (xmlNode.ChildNodes.Nodes [I], NewTreeNode);
end;



Código:

Var
   Node: IXMLNode;
   Nodes: IXMLNodeList;
   I: Integer;
begin
     if not XMLDocument1.Active then
        XMLDocument1.Active := True;
     Node := XMLDocument1.DocumentElement;
     ShowMessage(Node.NodeName);
     Nodes := Node.ChildNodes;
     if Node.HasChildNodes then
     begin
          for I := 0 to Nodes.Count - 1 do
          begin
               ShowMessage('Nodes('+Format('%.2d', [I])+') é '+Nodes[I].NodeName);
          end;
     end;
     XMLDocument1.Active := False;



Código:

Var
   I: Integer;
begin
     Memo1.Lines.Clear;
     XMLDocument1.LoadFromFile('Books.xml');
     XMLDocument1.Active := True;
     for i := 0 to XMLDocument1.DocumentElement.ChildNodes.Count - 1 do
     begin
          Memo1.Lines.Add('Autor:   '+XMLDocument1.DocumentElement.ChildNodes[I].ChildNodes['AUTHOR'].Text);
          //Memo1.Lines.Add('Título:  '+XMLDocument1.DocumentElement.ChildNodes[I].ChildNodes['TITLE'].Text);
          //Memo1.Lines.Add('Páginas: '+IntToStr(XMLDocument1.DocumentElement.ChildNodes[I].ChildNodes['TITLE'].NextSibling);
     end;
     XMLDocument1.Active := False;

bem, espero que com isto de para vc ter alguma idéia do processo...


bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
guhpatricio
Novato
Novato


Registrado: Segunda-Feira, 19 de Dezembro de 2011
Mensagens: 1

MensagemEnviada: Seg Dez 19, 2011 3:35 pm    Assunto: Problema relacionado Responder com Citação

Boa Tarde, Desculpe-me por reutilizar este tópico, mais minha dúvida é relacionada a este assunto.

Segui os passos sugeridos aqui, porém tive o seguinte problema.

Consigo acessar os nós filhos, e não me retorna mais a mensagem de resposta nula. Mas quando tento imprimir o conteúdo do nó imprime vazio, o código segue abaixo:

Código:

Node := XMLDocument1.DocumentElement.ChildNodes.Nodes['EnviarLoteRpsEnvio'].ChildNodes.Nodes['LoteRps'];

if (node <> nil) then
   begin
     Application.MessageBox(pchar(QuotedStr(Node.NodeName)),':: AVISO ::',MB_ICONWARNING);
     Application.MessageBox(pchar(QuotedStr(Node.ChildNodes.Nodes['NumeroLote'].Text)),':: AVISO ::',MB_ICONWARNING);
   end;


Ele entra normalmente no if, na primeira impressão ele imprime o nó correto, porém na segunda impressão ele imprime vazio. Já tentei diversas formas para recuperar o conteúdo dos nós e não estou conseguindo.
Obs. Desculpe-me se utilizei um tópico antigo, não sei se tem problema ou não.
Abraço, e obrigado pela atenção.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB