| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
rafaelralfi Novato

Registrado: Sexta-Feira, 17 de Outubro de 2008 Mensagens: 98
|
Enviada: Ter Abr 14, 2009 5:04 pm Assunto: Problema para ler um arquivo xml (Editado) |
|
|
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 |
|
 |
solitary_knight Aprendiz


Registrado: Quinta-Feira, 26 de Janeiro de 2006 Mensagens: 277
|
Enviada: Ter Abr 14, 2009 5:08 pm Assunto: |
|
|
| XMLDocument1.DocumentElement.ChildNodes.Nodes['NodeName'].Attributes['AttributeName'] |
|
| Voltar ao Topo |
|
 |
rafaelralfi Novato

Registrado: Sexta-Feira, 17 de Outubro de 2008 Mensagens: 98
|
Enviada: Ter Abr 14, 2009 5:28 pm Assunto: ... |
|
|
| 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 |
|
 |
solitary_knight Aprendiz


Registrado: Quinta-Feira, 26 de Janeiro de 2006 Mensagens: 277
|
Enviada: Ter Abr 14, 2009 5:39 pm Assunto: |
|
|
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 |
|
 |
rafaelralfi Novato

Registrado: Sexta-Feira, 17 de Outubro de 2008 Mensagens: 98
|
Enviada: Qua Abr 15, 2009 8:06 am Assunto: XML |
|
|
<?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 |
|
 |
rafaelralfi Novato

Registrado: Sexta-Feira, 17 de Outubro de 2008 Mensagens: 98
|
Enviada: Qua Abr 15, 2009 8:28 am Assunto: XML... |
|
|
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 |
|
 |
DonOctavioDelFlores Colaborador

Registrado: Quarta-Feira, 12 de Setembro de 2007 Mensagens: 2630 Localização: Pra lá de Bagda
|
Enviada: Qua Abr 15, 2009 2:06 pm Assunto: |
|
|
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 |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Qua Abr 15, 2009 3:01 pm Assunto: |
|
|
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 |
|
 |
guhpatricio Novato

Registrado: Segunda-Feira, 19 de Dezembro de 2011 Mensagens: 1
|
Enviada: Seg Dez 19, 2011 3:35 pm Assunto: Problema relacionado |
|
|
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 |
|
 |
|