2016-04-03 5 views
2

Lassen Sie sich die folgende XML-Datei übernehmen:Lazarus/Free Pascal: Lese/Schreib-Knoten mit dem gleichen Namen mit 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> 

Ich las this official tutorial und suchte im Internet, konnte aber nicht herausfinden. Ich versuche mit TXMLconfig Lisas Geschlecht zu lesen. Unterstützt diese Komponente keine XML-Dateien, die Knoten mit demselben Namen enthalten?


EDIT:

Es ist wie TXMLConfig scheint, ist wirklich nur für grundlegende und einfache Speicherung von Eigenschaften/Einstellungen für Ihre Anwendung und nicht für voll-auf XML-Datei Parsing passen. Sie sollten nur XML-Dateien lesen, die auch mit Ihrer Anwendung erstellt wurden. Unter diesen Umständen ist es sinnvoll, dass Knoten mit demselben Namen nicht unterstützt werden (da sie dieselbe Eigenschaft/Einstellung repräsentieren würden).

Wenn Sie XML-Dateien mit Knoten lesen möchten, die denselben Namen haben, lesen Sie die unten stehende Antwort von NineBerry.

Antwort

2

Sie können die TXMLConfig-Klasse nicht verwenden, da dies in der Tat nur funktioniert, wenn Sie nicht mehrere Knoten mit demselben Namen im selben übergeordneten Knoten haben.

Sie müssen die Low-Level-Funktionen verwenden. Hier ist ein Beispiel, wie man das Geschlecht von Lisa nachschaut:

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

(Es wäre eine gute Idee sein, eine gewisse Unterstützung in TXMLConfig hat das. Ich in dieser im Jahr 2006 lief, aber zum Glück um member1 unter Verwendung könnte, member2 etc als Tag-Typen) –

+0

Es ist wie TXMLConfig scheint wirklich nur zum einfachen und einfachen Speichern von Eigenschaften/Einstellungen für Ihre Anwendung und nicht zum vollständigen Parsen von XML-Dateien. Sie sollten nur XML-Dateien lesen, die auch mit Ihrer Anwendung erstellt wurden. Unter diesen Umständen ist es sinnvoll, dass Knoten mit demselben Namen nicht unterstützt werden (da sie dieselbe Eigenschaft/Einstellung repräsentieren würden). **** @ NineBerry: Sie haben Recht, ich muss möglicherweise TXMLconfig fallen lassen und mehr Low-Level-Funktionen verwenden. Vielen Dank für Ihren Beispielcode. – Jayjayyy

+0

@MarcovandeVoort - Ich hatte das gleiche Problem letztes Jahr und löste es genauso wie Sie – hdrz

0

Nur um mehr Option zu registrieren.

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; 
Verwandte Themen