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;
似乎 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;