Lazarus / Free Pascal:使用TXMLConfig读取/写入具有相同名称的节点

时间:2016-04-03 01:36:14

标签: xml lazarus freepascal

似乎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的性别?

2 个答案:

答案 0 :(得分:2)

您无法使用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.

答案 1 :(得分:0)

仅注册更多选项。

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;