查找IXMLNODE的父节点(在线等候)

wwwxuhong 2002-11-19 02:13:15
我用delhpi6的xml绑定生成一组基于ixmlnode的子接口,但用parentnode的属性访问父节点时,访问父节点的属性会出现Access volilation错误,请问各位大哥,这是什么原因,如何解决。
...全文
101 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhdanny 2003-03-25
  • 打赏
  • 举报
回复
用节点自上而下遍历一定能解决问题
ly_liuyang 2003-02-12
  • 打赏
  • 举报
回复
cg1120(代码最优化-§新年祝福你,好运伴着你§) 比好厉害哦
把我的文章都贴上了
是不是我们要交个朋友呀?呵呵,你不嫌弃的就成交

原文是
http://www.csdn.net/develop/read_article.asp?id=12428
Billy_Chen28 2003-02-12
  • 打赏
  • 举报
回复
type
pxnode=^rdIXMLNode;
rdIXMLNode=record
rd1:IXMLNode;
end;

procedure TForm1.acttreeExecute(Sender: TObject);
procedure add(Xnode:IXMLNode ; Tnode: TTreeNode) ;
Var
i :integer ;
V :TTreeNode ;
ptnd:pxnode;
begin
if Xnode.NodeType = ntElement then
begin
if Xnode.NodeName='FIELD'then
begin
new(ptnd);
V:=TreeView1.Items.AddChild(Tnode,(Xnode.Attributes['attrname']+' '+Xnode.Attributes['fieldtype']));
ptnd^.rd1:=Xnode;V.Data:=ptnd;
end;
for i := 0 to Xnode.ChildNodes.Count-1 do
begin
add(Xnode.ChildNodes[i],V);
end
end;
end;

var j : integer ;
begin
for j:= 0 to XML1.DocumentElement.ChildNodes.Count-1 do
begin
add(XML1.DocumentElement.ChildNodes[j], nil);
end;
end;

procedure TForm1.treeview1Change(Sender: TObject; Node: TTreeNode);
var s:string;
begin
s:=pxnode(node.Data)^.rd1.NodeName;
showmessage(s);
end;





已定义:

XMLDoc: TXMLDocument;

EncoderMIME: TIdEncoderMIME;

DecoderMIME: TIdDecoderMIME;

xn:IXMLNode;

f:TFileStream;

EncoderMIME和DecoderMIME是Indy控件中的Mime工具,用来把所有类型的字符串转换为Mime(Base64)的ASCII码,你用其他的编码方式也可以的,比如:UUE,XXE。

XN是XML文档的树结点。F是文件流。

首先,加载XML文档

xmldoc.LoadFromFile(‘XML文档的文件名');

xmldoc.Active:=true; //使XML文档变为活动

再次,定位Xn在XML文档中的位置(假设是的二层的第四个节点)

xn:=xmldoc.Node;

xn:=xn.ChildNodes.Nodes[1]; //节点数是从零开始的,所以要减一

xn:=xn.ChildNodes.Nodes[3];

接着,

增加下一级节点

xn:=xn.AddChild(‘新的节点名字’)

xn.Text:=’节点的文本内容’

xn.Attributes['节点的第一个属性']:=’属性值’

xn.Attributes['节点的第二个属性']:=’属性值’

修改节点,(节点的名字是不能改的)

xn.Text:=’新的文本内容’

xn.Attributes['节点的第二个属性']:=’ 新的属性值’

删除节点Xn

xn.ParentNode.ChildNodes.Delete(xn.ParentNode.ChildNodes.IndexOf(xn));

利用Xn.Text存放文件,

f:=TFileStream.Create('要存放的文件名',fmOpenRead);

xn.Text:=EncoderMime.Encode(f); //转换格式,文件编码

f.Free;

解出Xn.Text中的文件,

f:=TFileStream.Create(‘目标文件名’,fmCreate);

DecoderMime.DecodeToStream(xn.Text,f);

f.Free;

最好利用Xn.attribute来增加一个属性来表示文件的编码方式,比如

xn.Attributes['Type']='Base64'

这样改上面的两个片段为:

xn.Attributes['Type']:='Base64';

f:=TFileStream.Create('要存放的文件名',fmOpenRead);

xn.Text:=EncoderMime.Encode(f);

f.Free;

if xn.IsTextElement //Xn中存在Text

then if xn.HasAttribute('Type') then //Xn中存在属性’Type’

if xn.Attributes['Type']='Base64' then

begin

f:=TFileStream.Create(‘目标文件名’,fmCreate);

DecoderMime.DecodeToStream(xn.Text,f);

f.Free;

end;

最后给出一个利用TTreeView来显示XML文档的所有树结构

XMLTree是TTreeView类

procedure TForm1.ReadXMLTree(RootTreeNode:TTreeNode; XMLTreeNode:IXMLNode);

var i:integer; c:TTreeNode;

begin

for i:=0 to XMLTreeNode.ChildNodes.Count-1 do

begin

c:=xmltree.Items.AddChild(RootTreeNode,XMLTreeNode.ChildNodes.Nodes[i].NodeName);

ReadXMLTree(c,XMLTreeNode.ChildNodes.Nodes[i]);

end;

end;

使用方法

ReadXMLTree(nil,xmldoc.Node);

ly_liuyang 2003-02-12
  • 打赏
  • 举报
回复
parentnode的属性访问父节点是正确的,但不是所有的节点都有父节点的
最上的跟节点是DocumentElement!
mg2008 2002-11-22
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var TT:IXMLNode;
begin
// XML 为XMLDocument1控件
XML.Active:=false;
XML.XML.Clear;
XML.FileName:=ExePath+'Test.xml';
XML.Active:=True;
TT:= XML.DocumentElement.ChildNodes[0];
try
Caption:=TT.ChildNodes[‘City’].Text;
except
Caption:='没有该字段。';
end;
end;
rwdx 2002-11-20
  • 打赏
  • 举报
回复
gz

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧