【问题标题】:Lazarus/Free Pascal: read/write nodes with the same name using TXMLConfigLazarus/Free Pascal:使用 TXMLConfig 读/写同名节点
【发布时间】:2016-04-03 01:36:13
【问题描述】:

似乎TXMLConfig 仅适用于为您的应用程序保存基本和简单的属性/设置,而不适合完整的 XML 文件解析。您应该只读取 XML 文件,这些文件也是由您的应用程序创建的。在这些情况下,不支持具有相同名称的节点是有道理的,因为它代表相同的属性/设置。

让我们假设以下 XML 文件:

<Configuration Version="1.0">
  <Family Name="Simpson">
    <Member Gender="Male">Homer</Member>
    <Member Gender="Female">Marge</Member>
    <Member Gender="Male">Bart</Member>
    <Member Gender="Female">Lisa</Member>
    <Member Gender="Female">Maggie</Member>
  </Family>
</Configuration>

我阅读了this official tutorial 并搜索了网络,但无法弄清楚。有什么方法可以使用TXMLConfig 来读取Lisa 的性别吗?

【问题讨论】:

    标签: xml lazarus freepascal


    【解决方案1】:

    您不能使用 TXMLConfig 类,因为它确实只有在同一个父节点内没有多个同名节点时才有效。

    你必须使用更底层的函数。下面是一个如何查找 Lisa 性别的示例:

    uses
      Classes, SysUtils, CustApp, Dom, XmlRead
    
    var
      Doc: TXMLDocument;
      Members: TDOMNodeList;
      Member: TDOMNode;
      Gender: TDOMNode;
      i: integer;
    begin
    
      // Read the XML file into an XML Document
      ReadXMLFile(Doc, 'D:\A.xml');
    
      // Get all nodes with name "Member"
      Members:= Doc.GetElementsByTagName('Member');
    
      // For all Member nodes
      for i:= 0 to Members.Count - 1 do
      begin
        Member:= Members[i];
    
        // Check if their content is Lisa
        if(Member.TextContent = 'Lisa') then
        begin
          // Get the attribute with name "Gender"
          Gender:= Member.Attributes.GetNamedItem('Gender');
    
          // Output the value of the attribute
          Writeln(Gender.TextContent);
        end;
      end;
    
      Readln;
    end.
    

    【讨论】:

    • (在 TXMLConfig 中有一些支持是个好主意。我在 2006 年遇到过这个问题,但幸运的是可以使用 member1、member2 等作为标签类型)
    • @MarcovandeVoort - 去年我遇到了同样的问题,并以与您相同的方式解决了它
    • 我仍在使用 Delphi 下的 laz_xml 破解版 2006。我计划在不久的将来将它更新到 FPC(不是 Laz_*)版本。我会看看我是否可以对其进行更多现代化/集成。
    【解决方案2】:

    仅用于注册更多选项。

    procedure TFMain.getTicket;
    var xDoc: TXMLDocument;
        xNode : TDOMNode;
    begin
    
     tickt.Clear; // As TMemo
    
     xDoc  := DOMFromStream( rest );
    
     xNode := xDoc.ChildNodes.Item[ 0 ];
    
     tickt.Lines.Text := 'Id.....: ' + xNode.FindNode( 'id'      ).TextContent +#13
                       + 'Name...: ' + xNode.FindNode( 'name'    ).TextContent +#13
                       + 'e-mail.: ' + xNode.FindNode( 'email'   ).TextContent +#13
                       + 'Address: ' + xNode.FindNode( 'address' ).TextContent +#13
                       + 'City...: ' + xNode.FindNode( 'city'    ).TextContent +#13
                       + 'Phone..: ' + xNode.FindNode( 'phone1'  ).TextContent +#13
                       ;
    
    
    end;
    

    【讨论】:

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