delphi用xmldocument读取xml

时间:2013-11-21 11:17:38

标签: xml delphi

我有这个XML。我知道如何阅读“EDI_DC40”并获取值。

<ns0:ORDERS xmlns:ns0="http://Purchasing/GenericPartner">
  <EDI_DC40>
    <TABNAM>EDI_DC40</TABNAM>
    <MANDT>210</MANDT>
    <DOCNUM>1498177</DOCNUM>
    <DOCREL>700</DOCREL>
    <STATUS>30</STATUS>
    <DIRECT>1</DIRECT>
    <OUTMOD>2</OUTMOD>
    <EXPRSS></EXPRSS>
    <TEST></TEST>
    <IDOCTYP>ORDERS05</IDOCTYP>
    <CIMTYP></CIMTYP>
    <MESTYP>ORDERS</MESTYP>
    <MESCOD></MESCOD>
    <MESFCT>GEN</MESFCT>
    <STD></STD>
    <STDVRS></STDVRS>
    <STDMES>ORDERS</STDMES>
    <SNDPOR>SAPR3D</SNDPOR>
    <SNDPRT>LS</SNDPRT>
    <SNDPFC></SNDPFC>
    <SNDPRN>R3DCLNT210</SNDPRN>
    <SNDSAD></SNDSAD>
    <SNDLAD></SNDLAD>
    <RCVPOR>BT_EDIPURC</RCVPOR>
    <RCVPRT>LI</RCVPRT>
    <RCVPFC>BA</RCVPFC>
    <RCVPRN>0002000007</RCVPRN>
    <RCVSAD></RCVSAD>
    <RCVLAD></RCVLAD>
    <CREDAT>20101124</CREDAT>
    <CRETIM>085946</CRETIM>
    <REFINT></REFINT>
    <REFGRP></REFGRP>
    <REFMES></REFMES>
    <ARCKEY></ARCKEY>
    <SERIAL>20101116202544</SERIAL>
  </EDI_DC40>
  <E1EDK01>
    <CURCY>EUR</CURCY>
    <ZTERM>Z50D</ZTERM>
    <BELNR>4600006935</BELNR>
  </E1EDK01>
  <E1EDK03>
    <IDDAT>012</IDDAT>
    <DATUM>20101116</DATUM>
  </E1EDK03>
  <E1EDKA1>
    <PARVW>AG</PARVW>
    <TELF1>11111</TELF1>
    <TELFX>+111</TELFX>
    <BNAME>mataz</BNAME>
  </E1EDKA1>
  <E1EDKA1>
    <PARVW>WE</PARVW>
    <LIFNR>1000</LIFNR>
    <NAME1>skl</NAME1>
    <NAME2></NAME2>
    <STRAS>ulica skladišča 5</STRAS>
    <STRS2></STRS2>
    <ORT01>novo</ORT01>
    <PSTLZ>1000</PSTLZ>
    <LAND1>AU</LAND1>
  </E1EDKA1>
  <E1EDK17>
    <QUALF>001</QUALF>
    <LKOND>CIP</LKOND>
    <LKTEXT>Novo</LKTEXT>
  </E1EDK17>
  <E2EDP01008GRP>
    <E1EDP01>
      <POSEX>00001</POSEX>
      <MENGE>100.000</MENGE>
      <MENEE>PCE</MENEE>
      <VPREI>1.24</VPREI>
      <PEINH>100</PEINH>
      <NETWR>1.24</NETWR>
    </E1EDP01>
    <E1EDP20>
      <WMENG>100.000</WMENG>
      <EDATU>20101126</EDATU>
    </E1EDP20>
    <E1EDP19>
      <QUALF>001</QUALF>
      <IDTNR>000000000000201853</IDTNR>
      <KTEXT>NA</KTEXT>
    </E1EDP19>
  </E2EDP01008GRP>
  <E2EDP01008GRP>
    <E1EDP01>
      <POSEX>00001</POSEX>
      <MENGE>1000.000</MENGE>
      <MENEE>PCE</MENEE>
      <VPREI>2.24</VPREI>
      <PEINH>200</PEINH>
      <NETWR>1.4</NETWR>
    </E1EDP01>
    <E1EDP20>
      <WMENG>200.000</WMENG>
      <EDATU>20101126</EDATU>
    </E1EDP20>
    <E1EDP19>
      <QUALF>001</QUALF>
      <IDTNR>000000000000201853</IDTNR>
      <KTEXT>NA.CIPRINOL TBL A5 RU</KTEXT>
    </E1EDP19>
  </E2EDP01008GRP>
  <E1EDS01>
    <SUMID>002</SUMID>
    <SUMME>1.24</SUMME>
  </E1EDS01>
</ns0:ORDERS>

但我不知道如何阅读“E2EDP01008GRP”和“POSEX”内的值,特别是如果有两个同名节点。任何人都可以指出我正确的方向或在代码中显示我吗?

2 个答案:

答案 0 :(得分:4)

由于您在关于本文档的上一个问题中提到了TXMLDocument的用法,因此示例实现可能如下所示:

var
  DOC:IXMLDocument;
  i: Integer;
  OrderChilds, E1EDP01_Node: IXMLNode;
begin
  DOC := LoadXMLDocument('c:\temp\orders.xml');
  // iterate your root node 'OREDERS'
  for i := 0 to DOC.ChildNodes.Nodes['ORDERS'].ChildNodes.Count - 1 do
  begin
    OrderChilds := DOC.ChildNodes.Nodes['ORDERS'].ChildNodes[i];
    if OrderChilds.NodeName = 'E2EDP01008GRP' then  // Your node(s) of interest
    begin
      E1EDP01_Node := OrderChilds.ChildNodes.Nodes['E1EDP01'];
      if Assigned(E1EDP01_Node) then // did we find the node keeping the 'POSEX' node
        Memo1.Lines.Add(E1EDP01_Node.ChildNodes.Nodes['POSEX'].NodeValue)
    end;
  end;
end;

答案 1 :(得分:2)

您只需读取节点#1,然后读取节点#2,然后读取节点#3,等等。如果它们具有相同的名称 - 无关紧要。只是一个接一个地读它们。

你可以像这样枚举它们:superobject.googlecode.com/git/readme.html使用XML loader superobject.googlecode.com/git

或者您可以使用任何其他XML解析器。

等等

你也可以尝试一些EDI目标库,比如http://edisdk.sourceforge.net/index.htm,后来被合并到Jedi代码库中(但可能会被放弃并在以后删除)