我有一个大的
XML文件,大约50兆,我试图使用
OmniXML库来操作XML文档.
我不明白OmniXML中的演示……
XML文件的结构如下:
<rollercoaster build="0.1 (Dec 30 2010)" debug="no"> <settings name="roller coaster" sourcefile="rolcost.pas"> <description>Roller Coaster admin function</description> <year>2010</year> <manufacturer>ArtTeck</manufacturer> <sears name="sears.uk" size="1024" mda="87117ba5082cd7a615b4ec7c02dd819" region="england" set1="25d"/> <sears name="sears.dk" size="1056" mda="326dbbf94c6fa2e96613dedb53702f8" region="denmark" set1="25d"/> <sears name="sears.gr" size="6802" mda="01b4c38108d9dc4e48da4f8d5821377" region="greece" set1="65d"/> </settings> <settings name="roller coaster2" sourcefile="rolcost2.pas"> <description>Roller Coaster user function</description> <year>2010</year> <manufacturer>ArtTeck</manufacturer> </settings>...... and goes on </rollercoaster>
我想知道的事情是:
>如何使循环显示StringGrid中的节点和子节点.
>如何从单个节点获取数据(用于调试目的).
>如何选择设置节点的子节点?
>我如何获取同一节点的列表以及如何分离节点“sears”……?
解决方法
uses OmniXML,OmniXMLUtils; procedure TForm28.FormCreate(Sender: TObject); var descNode: IXMLNode; iNode : integer; node : IXMLNode; nodeList: IXMLNodeList; xml : IXMLDocument; begin xml := CreateXMLDoc; if XMLLoadFromFile(xml,'c:\0\roller.xml') then begin // node enumeration in D2005+ //for node in XMLEnumNodes(xml,'/rollercoaster/settings') do // lbLog.Items.Add(GetNodeTextStr(node,'description')); // node enumeration in D7 and older nodeList := xml.SelectNodes('/rollercoaster/settings'); for iNode := 0 to nodeList.Length - 1 do begin node := nodeList.Item[iNode]; lbLog.Items.Add(GetNodeTextStr(node,'description')); end; // selecting a single node with specified attribute name node := xml.SelectSingleNode('/rollercoaster/settings[@name="roller coaster2"]'); // accessing subnode text lbLog.Items.Add(GetNodeTextStr(node,'description')); // accessing subnode text,alternative way descNode := node.SelectSingleNode('description'); lbLog.Items.Add(GetNodeText(descNode)); // accessing node attribute lbLog.Items.Add(GetNodeAttrStr(node,'sourcefile')); end; end;