C++ Builder中怎样应用XML?(200分)

  • 主题发起人 主题发起人 慕容乾坤
  • 开始时间 开始时间

慕容乾坤

Unregistered / Unconfirmed
GUEST, unregistred user!
下载了MSXML4.0,Import Type Library完成。
现在对着一大堆的接口很是头疼,
谁能给我解释一下简单的DOM怎样实现?(最好有个小例子,本人应用BCB6)
还有就是如果不用那些比较讨厌的接口,而是用TXMLDocument去实现的话,
TXMLDocument的功能是和MSXML4.0同步的吗?怎样实现XPath这些技术呢?
请不吝赐教!!!!!!!!
 
用OpenXML吧,更新很快
http://www.philo.de/xml/
 
to jifee:
我要在项目中应用,所以我必须要跟随着微软这种制造标准的厂商(虽然XML标准不是他定的)。
而且听说MSXML也非常不错。[:)]
 
用XMLDOM呀!microsoft的。
 
to csmb:
请您看清问题描述。
我确实在用微软的MSXML分析器,没有用别的。
 
很简单啊!
delphi的例子:
...
var
XMLDoc: IXMLDomDocument;
begin
XMLDoc:=CoDOMDocument.Create ;
XMLDoc.load('./test_doc/lane-import.xml');
if xmltotree(treeview1,XMLDoc,True)=false then
application.MessageBox('转换失败'+chr(VK_Tab),'信息提示',MB_ok) ;
end;
...
...
function XmlToTree(sourcetree :TTreeview;XMLDocument:IXMLDomDocument;atrflag:Boolean):Boolean;
var
root: IXMLDomNode;
F_treenode:TTreeNode;
begin
//将xml转换为tree
if (sourcetree=nil) or (XMLDocument=nil) then
//判断树和xml文档是否为空
begin
result:=false;
exit;
end;
root:=XMLDocument.DocumentElement;
if root=nil then
//判断xml文档首节点是否为空
begin
result:=false;
exit;
end;
sourcetree.Items.Add(nil,root.NodeName);
F_treenode:=sourcetree.Items[0];
if atrflag then
addxmlAttributeNodes(sourcetree,F_treenode,root);
xmltotree(sourcetree,F_treenode,root,atrflag);
result:=True;
end;

function XmlToTree(sourcetree :TTreeview;F_treenode:TTreeNode;root:IXMLDomNode;atrflag:Boolean):Boolean;
var
Stock: IXMLDomNode;
i:Integer;
node_name:string;
// 节点的名称
c_treenode:TTreeNode;
begin
//增加节点的子节点以及其属性节点和子节点
if (sourcetree=nil) or (root=nil) then
begin
result:=false;
exit;
end;
for i:=0 to root.ChildNodes.length-1do
begin
node_name:=root.ChildNodes.NodeName;
if pos('#',node_name)>0 then
break
else
begin
Stock:=root.ChildNodes;
c_treenode:=sourcetree.Items.AddChild(F_treenode,node_name);
if atrflag then
addxmlAttributeNodes(sourcetree,c_treenode,stock);
xmltotree(sourcetree,c_treenode,stock,atrflag);
end;
end;
result:=True;
end;
function AddXmlAttributeNodes(sourcetree :TTreeview;F_treenode:TTreeNode;father_xml: IXMLDomNode):Boolean;
var
i: Integer;
node_name:string;
// 节点的名称
begin
//增加节点的属性节点
if (sourcetree=nil) or (father_xml=nil) then
begin
result:=false;
exit;
end;
if father_xml.attributes.length >0 then
begin
for i:=0 to father_xml.attributes.length-1do
begin
node_name:='@' + father_xml.Attributes.NodeName;
sourcetree.Items.AddChild(F_treenode,node_name);
end;
end;
result:=True;
end;
...
我随便做着玩的例子!见笑了!
 
to xs97:
十分感谢,我还想知道怎样使用xpath呢?
findnode好像只能查找nodelist之中的节点。
 
to 慕容乾坤
我不知道你要查什么,如果你要查节点的属性,
只要:
例子:节点[@属性名称='查询内容'] aa[@bb='cc']
节点[@属性名称>'查询内容'] aa[@bb>'1999-01-04']
根节点/父节点/节点/&属性名称 aa/bb/cc/@dd
 
to xs97:
是的,我是要查找节点属性或名称。
但是你说的这些在哪个方法里面实现呢?
 
用selectSingleNode/selectNodes
 
to 慕容乾坤
不错是用selectSingleNode/selectNodes,
我给个例子吧:
...
var
root,selnode: IXMLDomNode;
selnodes:IXMLDomNodeList;
i:Integer;
begin
...
selnodes:=root.selectNodes('ElementType/element[@type="查询的内容"]');
//查询节点属性
//selnodes:=root.selectNodes('ElementType/element');
//查询节点
//通过selnodes.length可以判断查询到几个节点
//selnode:=selnodes;定位到查询的节点。
...
 
to xs97:
因为我用BCB6,所以我将您的代码移植了过来,
但是出现了问题,运行抛出异常,请帮我看看哪里有问题。
代码如下:
void __fastcall TMainFrm::Button1Click(TObject *Sender)
{
Msxml2_tlb::TCOMIXMLDOMDocument2 xmldoc;
Msxml2_tlb::IXMLDOMNode *node;
Variant filename;
BSTR nodename;
try
{
if (OpenDialog1->Execute())
{
filename = OpenDialog1->FileName;
xmldoc = CoDOMDocument40::Create();
xmldoc->async = false;
xmldoc->load(filename);
node = xmldoc->documentElement;
node->get_nodeName(&nodename);
//出错就是这句,编译没问题
}
}
catch(Exception &exception)
{
ShowMessage(exception.Message);
return;
}
}
 
to 慕容乾坤

node->get_nodeName(&nodename);
中nodename你如何赋值的。
我单位机器没装c++ builder,等我回去帮你看看。
QQ多少?E-mail联系吧!
 
to xs97:
nodename不是在get_nodeName()中赋值的吗?
我的E-mail是free_lion@sina.com
QQ在上班的时候不能上
[:(]
 
to xs97:
您的E-mail和QQ是?
 
to 慕容乾坤:
抱歉,我看错了,xsok97@sina.com.
应该没问题,你的XML文档发给我好吗?
 
to xs97:
我知道答案了,谢谢您的解答。
看来Delphi和BCB还是有不小的区别啊!!!
分大部分是您的了,您不介意我分出10分给那位sofox仁兄吧?
[:)]
 
看看我的这篇文章
http://www.csdn.net/develop/read_article.asp?id=18144
 
后退
顶部