【问题标题】:delphi read xml with xmldocument [duplicate]delphi用xmldocument读取xml [重复]
【发布时间】:2013-11-21 11:17:37
【问题描述】:

我有这个 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”中的值,尤其是当有两个同名节点时。谁能指出我正确的方向或用代码告诉我?

【问题讨论】:

标签: xml delphi


【解决方案1】:

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

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;

【讨论】:

    【解决方案2】:

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

    您可以像这样枚举它们:使用 XML 加载器 superobject.googlecode.com/git 后的 superobject.googlecode.com/git/readme.html

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

    等等

    您也可以尝试一些针对 EDI 的库,例如 http://edisdk.sourceforge.net/index.htm,该库后来被合并到 Jedi 代码库中(但以后可能会被放弃和删除)

    【讨论】:

      猜你喜欢
      • 2013-08-28
      • 2015-05-18
      • 1970-01-01
      • 2010-10-30
      • 2012-10-20
      • 2016-11-14
      • 1970-01-01
      • 2016-02-14
      相关资源
      最近更新 更多