惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
Y
Y Combinator Blog
Recorded Future
Recorded Future
博客园 - Franky
I
InfoQ
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
Cyberwarzone
Cyberwarzone
The Register - Security
The Register - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
Cloudbric
Cloudbric
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
F
Full Disclosure
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Check Point Blog
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
T
Threat Research - Cisco Blogs
U
Unit 42
N
Netflix TechBlog - Medium
The Cloudflare Blog
Spread Privacy
Spread Privacy
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
T
Troy Hunt's Blog
Engineering at Meta
Engineering at Meta
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tenable Blog
B
Blog
S
Securelist
H
Hacker News: Front Page
Google Online Security Blog
Google Online Security Blog
G
Google Developers Blog

博客园 - dalongzero

Delphi7 对XML文档 [导入]飞跃云端 [导入]ksec 6人小聚 [导入]5月底的西交大 [导入]兴庆宫的幽径 [导入]恶魔城X 历代记 [导入]恶魔城X历代记 [导入]青春几何 [导入]自己的沙场 [导入]MIT水动力的讲义 考研总结篇 我的心怎能永远一片空白 关于利用Acronis Snap Deploy实现网刻的方法 07考研英语2 07年考研英语1 任天堂Wii VR Co. 苏格拉底与失恋者的对话 Goodbye to love
Delphi与XML
dalongzero · 2008-04-09 · via 博客园 - dalongzero

创建IXMLDOMDocument对象的三种方法:
(1)[方法1] 直接创建 IXMLDOMDocument  , 例(1)
   uses msxml;
   var DOC:IXMLDOMDocument;
   doc := CoDOMDocument.create;
   .....
   Doc := nil;
 A)doc.load('C:\temp.xml');  //从文件载入
 B) 动态创建

   var aElement,aElement2: IXMLDOMElement;  // [ aNode:IXMLDOMNode ==>  .AppendChild() ]

   //加入版本信息 ‘<?xml version="1.0" ?> ’
   doc.AppendChild(doc.CreateProcessingInstruction('xml', 'version="1.0" encoding="GB2312"'));
     (*)因为此函数返回结果不包含 'encoding="GB2312"' 故须保存前注意.
   //加入根结点
   doc.AppendChild(doc.CreateElement('bootDocNode')); //// == aElement 
   //加入子结点
   aElement:=IXMLDOMElement(Doc.DocumentElement.AppendChild(Doc.CreateElement('ChileNode1')));
   //设置接点属性
   aElement.SetAttribute('ID', '11');
   aElement.SetAttribute('Units', '元/m2');
   //设置结点内容
   aElement.AppendChild(Doc.CreateTextNode('结点内容'));
   //子结点添加子结点
   aElement2:=IXMLDOMElement(aElement.AppendChild(Doc.CreateElement('Child_ChileNode1')));

(2) [方法2] 直接创建 IXMLDocument ( 不是IXMLDOMDocument )
  uses XMLIntf,XMLDoc;
  var xmlDoc:IXMLDocument; aNode:IXMLNode;  s:string;

  xmlDoc := TXMLDocument.Create(nil);
  try
    //加入版本信息 ‘<?xml version="1.0" encoding="GB2312" ?> ’
    xmlDoc.Active := True;   xmlDoc.Version := '1.0';  xmlDoc.Encoding :='GB2312';
    //加入根结点
    aNode:=xmlDoc.AddChild('bootDocNode');
    //加入子结点
    aNode:=aNode.AddChild('ChileNode1');
    //设置接点属性
    aNode.SetAttribute('ID', '22');
    aNode.SetAttribute('Units', '元/m2');
    //设置结点内容
    aNode.Text := '结点内容';
    //子结点添加子结点
    aNode:=aNode.AddChild('Child_ChileNode1') ;
    aNode.Text := 'Child_ChileNod内容';
  
    s := xmlDoc.XML.Text ;  //  .XML 返回的是 Tstrings
  finally
    xmlDoc := nil ;
  end;

(3)利用 XMLDataBinding
    I) 准备好XML文件,此XML文件有较强的代表性,保证程序中所用的结点及其关系都存在
   II)利用 file-->new-->XML Data Binding
  III)创建XML对象
   A)v:string; //XML文件内容
    Doc : IXMLBudgetDocTyp; //IXMLBudgetDocTyp是XML文件的根结点
    Doc := LoadXMLData(v).GetDocBinding('BudgetDoc', TXMLBudgetDocType) as IXMLBudgetDocType;
   B)Doc := LoadBudgetDoc('C:\temp.xml');
  IV) 应用
    Doc.ChildNodes.FindNode('Docfile') as IXMLDocfileType;

(4)利用TXMLDocument控件


 XMLDocument1.fileName:='C:\temp.xml';
    XMLDocument1.active:=true;  // XMLDocument1 相当于 Doc

(5)XML对象的其他方法
   IXMLNodeList.FindNode(NodeName: DOMString): IXMLNode;
   IXMLNodeList.FindNode(NodeName, NamespaceURI: DOMString): IXMLNode;
   IXMLNodeList.FindNode(ChildNodeType: TGuid): IXMLNode;
   IXMLNodeList.FindSibling(const Node: IXMLNode; Delta: Integer): IXMLNode;
   IXMLNodeList.First: IXMLNode;
   IXMLNodeList.Last: IXMLNode;
   ... ...
   
////////////////////////////////////////////////////////////////////////
//例(1)
uses msxml;  
    doc:IXMLDOMDocument;
    budgetdoc:ixmlDomNode;
    Rela:IxmlDOMNode;
    rs:ixmldomnodelist;

//建立或取得XML结点
  doc := CoDOMDocument.create;
  doc.load('C:\temp.xml');
  budgetDoc := doc.selectSingleNode('BudgetDoc');
  rela := budgetdoc.SelectSingleNode('Relation');

//创建XML子结点 
  if not assigned(rela) then
  begin
    rela :=  doc.createElement('Relation');
    rela.setAttribute('BudgetId',0);
    rela.setAttribute('name','名称');
    budgetdoc.appendChild(rela);
  end;

//取子结点(序列)
  rs := rela.selectNodes('Rela[@BudgetId="2" and @TaskId="8"]');
  for i := 0 to rs.length -1 do
  begin
    s:= s + rs[i].attributes.getnameditem('NewRate').nodeValue;
  end;
 
  rela:=doc.ChildNodes.FindNode('DOMNode') as IxmlDOMNode;

//移除子结点
    for i := rs.length -1 downto 1 do
      rela.removeChild(rs[i])

//取父结点
    if assigned(anode.parentNode) and (Anode.parentNode.nodeName='Task') then
      result := Anode.parentNode;

//取属性
  DOC.DocumentElement.Attributes['Name']
  rela.Attributes['Name']
  rs.Nodes[i].Attributes['Name']

  Ajob:ixmldomnode;jobs:ixmldomNodeList;
  jobs := Ajob.selectNodes('RCJ[@Attrib="'+AAttrib+'"]')