2016-04-03 91 views
2

假设下面的XML文件相同的名称读/写节点:拉撒路/ Free Pascal中:使用TXMLConfig

<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文件,其中包含具有相同名称的节点?


编辑:

好像TXMLConfig真的只是为你的应用程序的性能/设置基本和简单的保存和不适合于具有完整的XML文件解析。你应该只读取XML文件,这些文件也是用你的应用程序创建的。在这种情况下,有意义的是不支持具有相同名称的节点(因为它会表示相同的属性/设置)。

如果您想读取具有共享名称的节点的XML文件,请参阅下面的NineBerry的答案。

回答

2

您不能使用TXMLConfig类,因为如果在同一个父节点内没有多个具有相同名称的节点,那么该方法确实只能工作。

您必须使用更低级别的功能。下面是一个如何查找丽莎性别的例子:

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. 
+0

(这将是一个不错的主意,有在TXMLConfig一些支持这一点。我在2006年遇到了这一点,但幸运的是,可以通过使用的member1,member2等作为标签类型周围) –

+0

好像TXMLConfig真的只是用于基本和简单地保存应用程序的属性/设置,而不适合完整的XML文件解析。你应该只读取XML文件,这些文件也是用你的应用程序创建的。在这种情况下,有意义的是不支持具有相同名称的节点(因为它会表示相同的属性/设置)。 **** @ NineBerry:你说得对,我可能不得不放弃TXMLConfig并使用更多的低级功能。感谢您的示例代码。 – Jayjayyy

+0

@MarcovandeVoort - 去年我遇到了同样的问题,并以与您相同的方式解决它 – hdrz

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;