阅读xml url Delphi

时间:2015-03-04 13:42:02

标签: xml delphi delphi-xe

我有以下XML。

<ArrayOfRapJ xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/pluriel.Models">
  <Rapj>
    <Libdep>% Fréquentation:</Libdep>
    <Total>36.860068259385665529010238910</Total>
  </Rapj>

我使用以下Delphi代码来阅读<Libdep><Total>值:

var
  DOC: IXMLDocument;
  i: Integer;
  OrderChilds, E1EDP01_Node: IXMLNode;
begin
  DOC := LoadXMLDocument('d:\Rapjrnprests.xml');

  for i := 0 to DOC.ChildNodes.Nodes['ArrayOfRapJ'].ChildNodes.Count - 1 do
  begin
    OrderChilds := DOC.ChildNodes.Nodes['RapJ'].ChildNodes[i];
    if OrderChilds.NodeName = 'RapJ' then  
    begin
      E1EDP01_Node := OrderChilds.ChildNodes.Nodes['Libdep'];
      if Assigned(E1EDP01_Node) then
        Memo1.Lines.Add(E1EDP01_Node.ChildNodes.Nodes['Total'].NodeValue)
    end;
  end;

XML正在使用URL命名空间。我如何阅读这些值?

2 个答案:

答案 0 :(得分:0)

您的代码对于您显示的XML是不正确的,即使不考虑名称空间也是如此。

尝试更像这样的东西:

var
  Doc: IXMLDocument;
  i: Integer;
  Arr, Node: IXMLNode;
  Libdep, Total: string;
begin
  Memo1.Clear;
  Doc := LoadXMLDocument('d:\Rapjrnprests.xml');

  // assuming <RapJArray> is the top-most element of the XML...
  Arr := Doc.DocumentElement;

  for i := 0 to Arr.ChildNodes.Count - 1 do
  begin
    Node := Arr.ChildNodes.Nodes[i];
    if (Node.NodeName = 'RapJ') {and (Node.NamespaceURI = 'http://schemas.datacontract.org/2004/07/pluriel.Models')} then
    begin
      Libdep := VarToStr(Node.ChildValues['Libdep']);
      Total := VarToStr(Node.ChildValues['Total']);
      if (Libdep <> '') and (Total <> '') then
        Memo1.Lines.Add(Libdep + ' ' + Total);
    end;
  end;
end;

答案 1 :(得分:0)

首先,你有一个简单的拼写错误。 XML区分大小写;你的XML包含(注意小写的j),而你的代码包含RapJ(注意大写的J)。代码必须完全匹配XML。

你的代码中也有一些不当处理。这是一个(非常简化的)工作示例(在XE7中测试)。

// Used in order to avoid creating a disk file. XML unchanged from
// question except for adding the closing </ArrayOfRapJ> element,
// which was missing

const
  XMLText = '<ArrayOfRapJ xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/pluriel.Models">' +
            '  <Rapj>' +
            '    <Libdep>% Fréquentation:</Libdep>' +
            '    <Total>36.860068259385665529010238910</Total>' +
            '  </Rapj>' +
            '</ArrayOfRapJ>';

procedure TForm5.Button1Click(Sender: TObject);
var
  Doc: IXMLDocument;
  DocNode: IXMLNode;
  Node: IXMLNode;
  i: Integer;
begin
  Doc := LoadXMLData(XMLText);
  DocNode := Doc.ChildNodes[0];

  for i := 0 to DocNode.ChildNodes.Count - 1 do
  begin
    Node :=  DocNode.ChildNodes[i];
    if Node.NodeName = 'Rapj' then
    begin
      Memo1.Lines.Add(Node.ChildNodes['Libdep'].Text);
      Memo1.Lines.Add(Node.ChildNodes['Total'].Text);
    end
    else
      Memo1.Lines.Add('Skipped node ' + Node.NodeName);
  end;
end;