![]() |
XML auslesen
Ich möchte folgendes XML auslesen. Ich habe das Forum
nach ähnlichen Beiträgen durchsucht, bin aber auf keinen Grünen Zweig gekommen. Ich brauche die Werte unter den Nodes ITEM
Delphi-Quellcode:
<?xml version="1.0" encoding="UTF-8"?>
-<project> <name>UBA </name> <controller>1</controller> <version>1.0</version> <creationdate>2014-02-15</creationdate> </project> -<group> <name>TEST</name> -<element> <name>KATEGORIE</name> -<item> <name>EINTRAG1</name> <valueint>0</valueint> <unit> </unit> <write>0</write> </item> -<item> <name>EINTRAG2</name> <valueint>0</valueint> <unit> </unit> <write>0</write> </item> </element> </group> |
AW: XML auslesen
Das was du da hast ist ein Text, der den Anschein erweckt im XML Format zu sein.
Ist er aber nicht. Hier ein ![]() |
AW: XML auslesen
So geht's:
Inhalt von test3.xml
Delphi-Quellcode:
<?xml version="1.0" encoding="UTF-8"?>
<TESTFILE> -<project> <name>UBA </name> <controller>1</controller> <version>1.0</version> <creationdate>2014-02-15</creationdate> </project> -<group> <name>TEST</name> -<element> <name>KATEGORIE</name> -<item> <name>EINTRAG1</name> <valueint>0</valueint> <unit> </unit> <write>0</write> </item> -<item> <name>EINTRAG2</name> <valueint>0</valueint> <unit> </unit> <write>0</write> </item> </element> </group> </TESTFILE>
Delphi-Quellcode:
procedure MM(s:String);
begin Form2.Memo1.lines.add(s); end; procedure ReadXMLFile2(const FileName:TFileName); //uses comobj const Msxml2_DOMDocument='Msxml2.DOMDocument.6.0'; var XmlDoc, Nodes : OleVariant; begin XmlDoc := CreateOleObject(Msxml2_DOMDocument); try XmlDoc.Async := False; XmlDoc.Load(FileName); XmlDoc.SetProperty('SelectionLanguage','XPath'); if (XmlDoc.parseError.errorCode <> 0) then raise Exception.CreateFmt('Error in Xml Data %s',[XmlDoc.parseError]); try Nodes := XmlDoc.selectNodes('//name'); MM(Nodes.Item(0).Text); except on E:Exception do MM('ERROR'); end; try Nodes := XmlDoc.selectNodes('//creationdate'); MM(Nodes.Item(0).Text); except on E:Exception do MM('ERROR'); end; // nach diesem Muster andere Nodes auslesen finally XmlDoc :=Unassigned; end; end; procedure TForm2.Button3Click(Sender: TObject); begin Memo1.Lines.LoadFromFile(ExtractFilePath(Application.ExeName)+'test3.xml'); ReadXMLFile2(ExtractFilePath(Application.ExeName)+'test3.xml'); end; |
AW: XML auslesen
Danke Hathor, funktioniert super. Ich programmiere nur gelegentlich in Delphi, deshalb muss
ich mir immer alles zusammensuchen. Bin mehr auf Automatisierungsstationen spezialisiert. Nochmals besten Dank und liebe Grüße |
AW: XML auslesen
Hallo zusammen,
mit XML hatte ich bis jetzt noch nichts zu tun. Ich möchte "auf bequeme" Art und Weise Daten einer XML-Datei auslesen. Der hier zur Verfügung gestellte Code scheint mir dafür genau richtig und er funktioniert mit der Beispiel-XML-Datei auch sehr gut. Meine XML_Datei ist ganz anders aufgebaut und da funktioniert der Code nicht. Ich weiß leider nicht wo der Code geändert werden muss, da meine Delphi-Hilfe zu "XmlDoc.selectNodes" auch nichts findet. Ich vermute das das die Stelle ist die angepasst werden muss. Hier meine XML-Datei:
Code:
Ich möchte z.B. Müller als Ergebnis auslesen.
<?xml version="1.0" encoding="ISO-8859-1"?>
<MESSAGE> <REQUEST CMD="ADD_MEDIA_OWNER"> <DATA> <PARAM AKTION="ADD_MEDIA_OWNER" SALUTATION="Frau" NAME="Müller" CHRISTIAN_NAME="Lieschen" STREET="" COUNTRY="" ZIP_CODE="" CITY="" BIRTHDATE="" DEPARTMENT="" DIVISION="" COST_CENTRE="" ACTIVITY="" ROOM="" PHONE_PRIVATE="" PHONE_OFFICE="" PHONE_MOBILE="" FAX="" EMAIL="" PERSONNEL_NUMBER="2" PICTURE_FILENAME="" COMMENT="" LICENSE_NUMBER="OF130386"></PARAM> </DATA> </REQUEST> </MESSAGE> Kann mir hier jemand Hilfestellung geben? Vielen Dank vorab! |
AW: XML auslesen
Du mußt mal nach Attributen suchen. NAME ist ein Attribut von PARAM mit dem Wert "Müller".
Ansonsten suche Dir einen XML-Parser zB : himXML (hier im Forum) Simple Storage + OmniXML (meine Empfehlung) |
AW: XML auslesen
OmniXML ist nun auch Teil von Delphi (XE7)
|
AW: XML auslesen
Zitat:
|
AW: XML auslesen
Halllo,
das Einarbeiten in XML war mir *im Moment* zu langwierig, so dass ich dann doch eine Funktion geschrieben habe welche mir die XML Attribute ausliest (da ich auch zeitnah eine Lösung brauchte).
Delphi-Quellcode:
Was ich mich nun frage:
function Extract_XMLAttribut(aXML_File, start_Attributname, end_Attributname: string): string; //XML-Attribute auslesen
var i_start, i_end: Integer; begin Result := ''; i_start := Pos(start_Attributname, aXML_File); if i_start > 0 then begin i_start := i_start + Length(start_Attributname); i_end := Pos(end_Attributname, aXML_File); if i_end > i_start then begin Result := copy(aXML_File, i_start, i_end - i_start); end; end; end; Was spricht gegen solch eine Funktion (für mich leicht verständlich), warum sollte man Msxml2_DOMDocument anwenden? Ich muss zw. 100 - 1500 von diesen XML-Strukturen einlesen, ich glaube nicht dass da große Performance Unterschiede sein werden, wobei Performance in meinem Fall zweitrangig ist. |
AW: XML auslesen
Änderungsvorschlag:
Delphi-Quellcode:
procedure MM(s:String);
begin Form2.Memo1.lines.add(s); end; procedure MM2(s:String); begin Form2.Memo2.lines.add(s); end; function Extract_XMLAttribut2(aXML_File, start_Attributname: string): string; //XML-Attribute auslesen var i_start, i_end: Integer; zstr : String; begin Result := ''; i_start := Pos(start_Attributname, aXML_File); if i_start > 0 then begin i_start := i_start + Length(start_Attributname); zstr := copy(aXML_File, i_start, 50); // ist 50 der längste string? i_end:= Pos('"',zstr); Result := copy(zstr, 1, i_end-1); end; end; procedure TForm2.Button3Click(Sender: TObject); var str : String; begin Memo1.Clear; Memo1.Lines.LoadFromFile(ExtractFilePath(Application.ExeName)+'test.xml'); str:= Extract_XMLAttribut2(Memo1.text, 'NAME="'); MM2(str); str:= Extract_XMLAttribut2(Memo1.text, 'CHRISTIAN_NAME="'); MM2(str); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz