2016-04-03 83 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;