原来用Delphi处理XML文件就感觉头疼,不知道该用哪种方法比较好,现在将方法总结如下:
本文中演示用到的XML文件
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <UserList> <User Name="Liu" ID="1"> <Website><![CDATA[http://svn1.bcoder.com]]></Website> <Intro>I come from hebei.</Intro> </User> <User Name="Zhang" ID="2"> <Website><![CDATA[http://www.desktoptool.net]]></Website> <Intro>I come from Shandong.</Intro> </User> </UserList> |
1. 使用msxml
msxml实际上是Delphi导入的Windows的msxml2.dll,所以最终是使用的windows的方法去解析的xml文件。在PHP中对XML的解析也是用的MSXML,与Delphi的各函数都非常的类似。使用时需要在uses中加入mshtml。读取XML文件的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
procedure TForm1.LoadXML(XMLStr: string); var xmldoc: IXMLDOMDocument; rNode, usrNode: IXMLDOMNode; I: Integer; begin xmldoc := CoDOMDocument.Create; //可以使用下面这个函数从文件中加载XML //xmldoc.load('e:/user.txt'); xmldoc.loadXML(XMLStr); rNode := xmldoc.selectSingleNode('UserList'); if rNode <> nil then begin for I := 0 to rNode.childNodes.length - 1 do begin usrNode := rNode.childNodes[I]; if usrNode.nodeName = 'User' then begin Memo2.Lines.Add('Name: ' + usrNode.attributes.getNamedItem('Name').text); Memo2.Lines.Add('ID: ' + usrNode.attributes.getNamedItem('ID').text); if usrNode.selectSingleNode('Website') <> nil then Memo2.Lines.Add('Website: ' + usrNode.selectSingleNode('Website').text); if usrNode.selectSingleNode('Intro') <> nil then Memo2.Lines.Add('Intro: ' + usrNode.selectSingleNode('Intro').text); Memo2.Lines.Add(''); end; end; end; xmldoc := nil; end; |
写XML文件的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
procedure TForm1.UpdateXml(XMLStr: string); var xmldoc: IXMLDOMDocument; rNode, usrNode, webNode, introNode, commentNode: IXMLDOMNode; newAttr: IXMLDOMAttribute; begin xmldoc := CoDOMDocument.Create; //可以使用下面这个函数从文件中加载XML //xmldoc.load('e:/user.txt'); xmldoc.loadXML(XMLStr); rNode := xmldoc.selectSingleNode('UserList'); if rNode <> nil then begin usrNode := xmldoc.createElement('User'); // 如果是下面这种方式创建的NODE,则该NODE不支持一些方法,比如attributes.setNamedItem // 因为这种方法创建的NODE的attributes为nil //usrNode := xmldoc.createTextNode('User'); rNode.appendChild(usrNode); newAttr := xmldoc.createAttribute('Name'); newAttr.nodeValue := 'Chen'; usrNode.attributes.setNamedItem(newAttr); newAttr := xmldoc.createAttribute('ID'); newAttr.nodeValue := '3'; usrNode.attributes.setNamedItem(newAttr); webNode := xmldoc.createElement('Website'); webNode.appendChild(xmldoc.createCDATASection('http://www.google.com')); usrNode.appendChild(webNode); introNode := xmldoc.createElement('Intro'); introNode.appendChild(xmldoc.createTextNode('I come from TianJin.')); usrNode.appendChild(introNode); commentNode := xmldoc.createElement('Comment'); commentNode.appendChild(xmldoc.createComment('This is a comment!')); usrNode.appendChild(commentNode); end; xmldoc.save('E:user.xml'); xmldoc := nil; end; |
用此方法生成的XML文件没有被格式化,即不是一个NODE一行,如果需要格式化输入,需要使用SaxWriter输出到文件。
另外还有一些其他比较有意思的方法,如:cloneNode,以后应该能用得到。
2. 使用TXmlDocument读写XML
读取XML文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
procedure TForm1.LoadXmlDoc(XmlStr: string); var rNode: IXMLNode; I: Integer; begin XMLDocument1.LoadFromXML(Memo1.Text); rNode := XMLDocument1.ChildNodes.FindNode('UserList'); if rNode <> nil then begin for I := 0 to rNode.ChildNodes.Count - 1 do begin if rNode.ChildNodes[I].Attributes['Name'] <> null then Memo2.Lines.Add('Name: ' + rNode.ChildNodes[I].Attributes['Name']); if rNode.ChildNodes[I].Attributes['ID'] <> null then Memo2.Lines.Add('ID: ' + rNode.ChildNodes[I].Attributes['ID']); if rNode.ChildNodes[I].ChildNodes.FindNode('Website') <> nil then Memo2.Lines.Add('WebSite: ' + rNode.ChildNodes[I].ChildNodes.FindNode('Website').Text); if rNode.ChildNodes[I].ChildNodes.FindNode('Intro') <> nil then Memo2.Lines.Add('Intro: ' + rNode.ChildNodes[I].ChildNodes.FindNode('Intro').Text); memo2.Lines.Add(''); end; end; end; |
写XML文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
procedure TForm1.UpdateXmlDoc(XmlStr: string); var rNode, usrNode, webNode, IntroNode: IXMLNode; I: Integer; begin XMLDocument1.LoadFromXML(Memo1.Text); XMLDocument1.Active := True; // 使用属性自动格式生成 的XML文件 //XMLDocument1.Options := XMLDocument1.Options + [doNodeAutoIndent]; rNode := XMLDocument1.ChildNodes.FindNode('UserList'); if rNode <> nil then begin usrNode := rNode.AddChild('User'); usrNode.SetAttributeNS('Name', '', 'Zhang'); usrNode.SetAttributeNS('ID', '', '3'); webNode := usrNode.AddChild('WebSite'); webNode.NodeValue := 'http://www.google.com'; IntroNode := usrNode.AddChild('Intro'); IntroNode.NodeValue := 'I come from TianJin.'; end; XMLDocument1.SaveToFile('E:user.xml'); end; |
注意事项: