Lazarus/Free Pascal:read/write 个使用 TXMLConfig 的同名节点

Lazarus/Free Pascal: read/write nodes with the same name using TXMLConfig

似乎 TXMLConfig 只适用于为您的应用程序基本和简单地保存 properties/settings,而不适合全面的 XML 文件解析。您应该只读取 XML 个文件,这些文件也是由您的应用程序创建的。在这种情况下,不支持同名节点是有道理的,因为它代表相同的 property/setting.

让我们假设以下 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 的性别吗?

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

你必须使用更底层的功能。这是一个如何查找 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.

只为注册更多选项。

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;