Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi7-使用OmniXML库操作XML文件_Xml_Delphi_Delphi 7 - Fatal编程技术网

Delphi7-使用OmniXML库操作XML文件

Delphi7-使用OmniXML库操作XML文件,xml,delphi,delphi-7,Xml,Delphi,Delphi 7,我有一个很大的XML文件,大约50兆,我试图使用这个库来操作XML文档 我不理解OmniXML中的演示 XML文件的结构如下所示: <rollercoaster build="0.1 (Dec 30 2010)" debug="no"> <settings name="roller coaster" sourcefile="rolcost.pas"> <descr

我有一个很大的XML文件,大约50兆,我试图使用这个库来操作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>

过山车管理功能
2010
阿尔特克
过山车用户功能
2010
阿尔特克
...... 然后继续
我想知道的是:

  • 如何使循环显示StringGrid中的节点和子节点
  • 如何从单个节点获取数据(用于调试目的)
  • 如何选择设置节点的子节点
  • 如何获取同一节点的列表以及如何分离节点“sears”

使用delphi 7中提供的TXMLDocument或自己制作praser@opc0de:该问题专门询问OmniXML,因此建议使用TXMLDocument或滚动另一个解析器是没有用的。@opc0de:无参数。只是指出你没有回答所问的问题。你说的“获取同一节点的列表”是什么意思?你说的“分离节点”是什么意思?也许你应该只是从这两个函数中得到你所期望的输出。我的英语再一次。。。。我的意思是我有相同的节点“sears”,我怎么知道哪个sears节点是。。。我如何控制bcs“sears”节点存在于下一个“设置”节点中并继续下去。。。对不起,我的英语不好。我想补充一点解释:“OmniXML对象支持迭代,所以您可以在支持..in语法的Delphi版本的for循环中使用它们。”。此代码仅在Delphi2005中有效。在D7中工作的第二个变体对于OP来说很方便。我的意思是,“只在Delphi2005及以上版本中工作,包括Delphi XE”。Warren,你完全正确。我忘了“Delphi 7”部分。我会更新演示的,我是为你做的!检查下面。请随意复制。好的,现在它在D7中工作,太好了!我的答案现在没有意义了,删除了。
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;