请教几个TXMLDocument问题,请指教

lshfong 2010-11-02 04:29:01
<?xml version="1.0" encoding="utf-8"?>
<ROOT>
<user>
<record>
<key>1</key>
<username>pangmen</username>
<sex>男</sex>
<tel>139999999</tel>
<address>北京</address>
</record>
<record>
<key>2</key>
<username>pangmen</username>
<sex>男</sex>
<tel>139999999</tel>
<address>北京</address>
</record>

<record>
<key>3</key>
<username>pangmen</username>
<sex>男</sex>
<tel>139999999</tel>
<address>北京</address>
</record>
</user>
<Role>
<row>
<key>1</key>
<pid>1,2,3</pid>
</row>
<row>
<key>2</key>
<pid>2,3</pid>
</row>
<row>
<key>3</key>
<pid>1</pid>
</row>
</Role>

</ROOT>

=========================================
1、怎么取指定节点下的子节点数据,比如我只遍历取Role节点下的数据,而不需要从根开始遍历
2、不遍历的情况下怎么查询子节点,在c#可以用XmlObj.SelectSingleNode实现,bcb中有对应的函数吗
...全文
145 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahaozi 2011-02-16
  • 打赏
  • 举报
回复

#include <XMLDoc.hpp>
#include <msxmldom.hpp>
TXMLDocument *xmlDoc = new TXMLDocument(this);
xmlDoc->LoadFromFile("a.xml");

_di_IXMLDOMNodeRef refNode = xmlDoc->DocumentElement->DOMNode;
_di_IXMLDOMNode root = refNode->GetXMLDOMNode();

if (root!=NULL)
{
_di_IXMLDOMNode n;
root->selectSingleNode("//Config/Base/Ckdp",n);
if (n!=NULL)
{
ShowMessage(n->text);
}
}

delete xmlDoc;
ccrun.com 2010-11-03
  • 打赏
  • 举报
回复
如果没有往窗体上拖过TXMLDocument控件,那么编译时还需要添加一个lib文件。
zzbinfo 2010-11-03
  • 打赏
  • 举报
回复
必要得头文件
#include <msxmldom.hpp>
#include <XMLDoc.hpp>
#include <xmldom.hpp>
#include <XMLIntf.hpp>
zzbinfo 2010-11-03
  • 打赏
  • 举报
回复
不用遍历,这样弄,但是你上面得文件内容要改一下,由于有中文编码要用GB2312,改成<?xml version="1.0" encoding="GB2312" ?>
void __fastcall TForm1::btn1Click(TObject *Sender)
{
_di_IXMLDocument XMLDoc = NewXMLDocument();
XMLDoc->LoadFromFile("3.xml");
try{
XMLDoc->Active = true;
}
catch(...)
{
ShowMessage("文件格式出错");
return ;
}
_di_IXMLNode rootdataset = XMLDoc->DocumentElement;
_di_IXMLNodeList NewDataSetNodeList = rootdataset->GetChildNodes();
_di_IXMLNode NewDataSetNode = NewDataSetNodeList->FindNode("Role");
_di_IXMLNodeList NodeList = NewDataSetNode->GetChildNodes();
for(int i=0;i<NodeList->GetCount() ;i++)
{
_di_IXMLNode RowNode = NodeList->Get(i);
_di_IXMLNodeList NodeList1 = RowNode->GetChildNodes();
_di_IXMLNode Node = NodeList1->FindNode("key");
ShowMessage(Node->GetNodeValue());
Node = NodeList1->FindNode("pid");
ShowMessage(Node->GetNodeValue());
}

}
lshfong 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zzbinfo 的回复:]
还有,你上面贴得xml都不全,你看看是不是贴少了
[/Quote]
没有啊,我在c#和php里可以正确解析的,浏览器也可以解析
lshfong 2010-11-03
  • 打赏
  • 举报
回复
妖哥,能再详细一点吗,兄弟初学bcb
ccrun.com 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lshfong 的回复:]
noderef:=XMLDocument1.DocumentElement.DOMNode as IXMLDOMNodeRef;
root:=noderef.GetXMLDOMNode;
NodeList:=root.selectNodes( 'node1/node2/node3/node4 ');

象delphi这样
[/Quote]

XMLDocument1->LoadFromFile(L"D:\\ccrun\\123.xml");
_di_IXMLDOMNodeRef refNode = XMLDocument1->DocumentElement->DOMNode;
_di_IXMLDOMNode root = refNode->GetXMLDOMNode();

_di_IXMLDOMNodeList NodeList;
root->selectNodes("node1/node2/node3", NodeList);
lshfong 2010-11-03
  • 打赏
  • 举报
回复
noderef:=XMLDocument1.DocumentElement.DOMNode as IXMLDOMNodeRef;
root:=noderef.GetXMLDOMNode;
NodeList:=root.selectNodes( 'node1/node2/node3/node4 ');

象delphi这样
lshfong 2010-11-03
  • 打赏
  • 举报
回复
怎么才能支持xpath语法呢
lshfong 2010-11-02
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20030329/09/1591778.html
zzbinfo 2010-11-02
  • 打赏
  • 举报
回复
还有,你上面贴得xml都不全,你看看是不是贴少了
zzbinfo 2010-11-02
  • 打赏
  • 举报
回复
现在贴过来,我给你弄
lshfong 2010-11-02
  • 打赏
  • 举报
回复
在Delphi区中找到了一个解决方案,哪个老师翻译成bcb的
lshfong 2010-11-02
  • 打赏
  • 举报
回复
for (int n = 0; n < nodes->Count; n++) {
node = nodes->Nodes[n]->ChildNodes->First();
for (int i = 0; i < nodes->Nodes[n]->ChildNodes->Count; i++) {

Memo1->Lines->Append(nodes->Nodes[n]->ChildNodes->Nodes[i]->GetText));
}
}
用遍历的方法,当数据多或层很深时太耗资源了
lshfong 2010-11-02
  • 打赏
  • 举报
回复
支持xpath语法吗
zzbinfo 2010-11-02
  • 打赏
  • 举报
回复
可以用这两个,具体你自己琢磨一下,今天没有时间帮着写代码了
      NodeList = NewDataSetNode->GetChildNodes();
_di_IXMLNode Node = NodeList->FindNode(WideString("PackgType"))

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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