2010-11-19 6 views
0

Hey von der Post Anfrage bekomme ich Antwort eine XML-Datei. z.Damit mein XML gut aussieht! Delphi :)

'<?xml version="1.0" encoding="UTF-8" ?>'#$D#$A'<PosXML version="6.0.2">'#$D#$A#9'<ShowInfoResponse>'#$D#$A#9#9'<ReturnCode>0</ReturnCode>'#$D#$A#9'</ShowInfoResponse>'#$D#$A'</PosXML>' 

Frage ist, wie kann ich das richtig, dass, weil ich es LoadXMLData (‚Hier‘) senden müssen; Hier

ist der Code:

procedure TForm1.Button3Click(Sender: TObject); 
var 
xmldocument1:ixmldocument; 
responseNode:ixmlnode; 
test:string; 
begin 
xmldocument1 := loadxmldata('<?xml version="1.0" encoding="UTF-8" ?>'#$D#$A'<PsXML>'#$D#$A#9'<ShowInfo>'#$D#$A#9#9'<Code>1234</Code>'#$D#$A#9'</ShowInfo>'#$D#$A'</PsXML>'); 
responsenode := xmldocument1.DocumentElement.childnodes.Findnode('Code'); 
test := responsenode.ChildNodes[0].Text; 

Das Problem ist, dass Test (string) immer thows eine Ausnahme becuase responsenode Null ist. Vielen Dank im Voraus!

+3

Was ist dein Problem? Sieht auf den ersten Blick wie ein gültiges XML aus. – CodesInChaos

+0

XML ist primär für den Datenaustausch zwischen automatisierten Prozessen. Menschliche Lesbarkeit ist an zweiter Stelle. Wenn Sie eine eingerückte XML-Datei erstellen möchten, können Sie ein Tool dafür verwenden. –

+0

Die von ihm gepostete Zeichenfolge ist gut eingerückt. – CodesInChaos

Antwort

4

Sie sind falsch angenommen, dass etwas mit Ihrem XML nicht stimmt.

Die Eigenschaft DocumentElement gibt Ihnen einen Verweis auf den Knoten PsXML oder PosXML. Durch Lesen der ChildNodes-Eigenschaft erhalten Sie eine Liste der untergeordneten Elemente dieses Knotens. Diese Liste besteht nur aus einem Element, einem ShowInfo Knoten oder ShowInfoResponse. Der Aufruf von FindNode auf dieser Liste kann Ihnen nur einen dieser Werte geben. Es durchsucht nicht die untergeordneten Elemente der Knoten in der Liste. Da das Dokumentelement kein untergeordnetes Element Code enthält, gibt FindNode korrekt nil zurück.

Ich vermute, dass Sie durch den Debugger verwirrt werden. Ihr Programm hat etwas aus dem Netzwerk abgerufen, und Sie speichern das in einer Zeichenfolge. Sie verwenden den Debugger, um zu sehen, was sich in dieser Zeichenfolge befindet, und der Debugger zeigt Ihnen etwas mit einer Reihe von Nummernzeichen und Dollarzeichen, von denen Sie sicher sind, dass sie nicht da sind. Ihr Code wählt nicht den richtigen Knoten aus, daher ziehen Sie den Schluss, dass die verwirrende XML-Zeichenfolge die Ursache sein muss.

Aber das XML ist korrekt. Und es ist sogar schon hübsch gedruckt! Es verfügt über Zeilenumbrüche und Tabulatorzeichen, um Dinge einzurücken. Der Debugger möchte Ihnen jedoch eine eindeutige Zeichenfolge anzeigen. Wenn es eine tatsächliche mehrzeilige Zeichenfolge und eingerückte Dinge zeigte, dann würden Sie als Programmierer nicht wissen, was wirklich in der Zeichenfolge war. Stattdessen zeigt der Debugger die numerischen Zeichencodes der Zeichen an, die nicht angezeigt werden können. Carriage Returns und Zeilenvorschübe haben die numerischen Werte 13 bzw. 10. Die hexadezimalen Werte sind D und A. Der Debugger verwendet Delphis eigenes String-Literal-Format, um den Wert anzuzeigen. numerische Zeichenliterale werden mit einem #-Symbol gefolgt von dem numerischen Code des Zeichens eingeführt. Die $ zeigt an, dass die Nummer hexadezimal ist.

+0

sehr gut erklärt, danke !!! – Peacelyk

3

Um XML-Code "hübsch zu drucken", können Sie die Delphi-Funktion FormatXMLData verwenden. LoadXMLData gibt jedoch keine Bonuspunkte für die menschliche Lesbarkeit, so dass die ursprüngliche Zeichenfolge in Ordnung wäre.

+0

Die ursprüngliche Zeichenfolge sollte * definitiv * funktionieren, da sie * bereits * formatiert ist. –

1

Diese Zeichenfolge funktioniert problemlos mit LoadXMLData ohne Änderungen. Dinge wie Leerzeichen und Zeilenumbrüche werden ignoriert.

0

Sie suchen nach dem falschen Knoten, deshalb gibt es null zurück. Sie müssen nach "ReturnCode" anstelle von "Code" suchen.

+1

Sein erstes Beispiel außerhalb seines Codebeispiels hat "ReturnCode", sein Codebeispiel verwendet jedoch "Code". Wow das klingt verwirrend – kirkdmo

0

Ich denke, Ihr Problem ist, dass Code ein Child-Knoten von ShowInfoResponse ist. Was dazu:

responsenode := xmldocument1.DocumentElement.childnodes[0]; 
test := responsenode.ChildNodes['Code'].Text; 
0

IXMLNodeList.FindNode Methode sucht die Suche NodeName nur auf dem Knoten in der Liste enthalten ist, und nicht in dem untergeordneten Knoten.

Wenn das, was Sie wollen auf den gesamten Baum zu sehen ist, diese Funktion verwenden:

function RecursiveFindNode(ANode: IXMLNode; const SearchNodeName: string): IXMLNode; 
var 
    I: Integer; 
begin 
    if CompareText(ANode.NodeName, SearchNodeName) = 0 then 
    Result := ANode 
    else if not Assigned(ANode.ChildNodes) then 
    Result := nil 
    else begin 
    for I := 0 to ANode.ChildNodes.Count - 1 do 
    begin 
     Result := RecursiveFindNode(ANode.ChildNodes[I], SearchNodeName); 
     if Assigned(Result) then 
     Exit; 
    end; 
    end; 
end; 

Dann, so etwas wie dies machen:

var 
    I: Integer; 
    ANode: IXMLNode; 
begin 
    xmldocument1 := loadxmldata('<?xml version="1.0" encoding="UTF-8" ?>'#$D#$A'<PsXML>'#$D#$A#9'<ShowInfo>'#$D#$A#9#9'<Code>1234</Code>'#$D#$A#9'</ShowInfo>'#$D#$A'</PsXML>'); 
    ANode := RecursiveFindNode(xmlDocument1.DocumentElement, 'Code'); //or ReturnCode if you use the first version of the XML 
    if Assigned(ANode) then 
    ShowMessage('Eureka!'); 
end; 

Warnung für Knoten sucht diese Art und Weise ist sehr ineffizient. Wenn Sie die Dokumentstruktur voraussehen können, ist es besser, dieses Wissen zu verwenden, um durch das Dokument zu navigieren und die Suche nur bei Bedarf zu verwenden.

Verwandte Themen