【问题标题】:Read xml url Delphi读取xml url Delphi
【发布时间】:2015-03-04 13:42:02
【问题描述】:

我有以下 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 代码读取 &lt;Libdep&gt; 和 &lt;Total&gt; 值:

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 命名空间。如何读取这些值?

【问题讨论】:

  • 您的要求并不清楚。您可以发布您拥有的任何代码吗?
  • 完成了,谢谢:)
  • 你好。为了将来参考,您可以随时编辑自己的帖子并向其中添加任何其他信息。发布不是答案的答案是不受欢迎的。为免生疑问,我对 Delphi 一无所知 - 如果您的问题很好(在所有正确的地方都有所有正确的信息),您更有可能从了解此类内容的人那里得到答案。
  • 这个问题没有一个问号...你的问题是什么?

标签: xml delphi delphi-xe


【解决方案1】:

即使没有考虑命名空间,您的代码对于您显示的 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;

【讨论】:

    【解决方案2】:

    首先,您有一个简单的错字。 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      相关资源
      最近更新 更多