Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML auslesen (https://www.delphipraxis.net/179125-xml-auslesen.html)

Michael0508 16. Feb 2014 01:55

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>

Sir Rufo 16. Feb 2014 02:38

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 XML-Validierer

hathor 16. Feb 2014 15:31

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;

Michael0508 16. Feb 2014 19:28

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

juergen 25. Sep 2014 21:25

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:
<?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>
Ich möchte z.B. Müller als Ergebnis auslesen.

Kann mir hier jemand Hilfestellung geben?
Vielen Dank vorab!

Jens01 25. Sep 2014 21:55

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)

mkinzler 26. Sep 2014 09:56

AW: XML auslesen
 
OmniXML ist nun auch Teil von Delphi (XE7)

Jens01 26. Sep 2014 11:46

AW: XML auslesen
 
Zitat:

OmniXML ist nun auch Teil von Delphi (XE7)
Ach, haben die auch Simple Storage oder etwas vergleichbares hineingepackt. Allein ist OmniXML doch manchmal etwas sperrig.

juergen 26. Sep 2014 20:38

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:
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 ich mich nun frage:
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.

hathor 26. Sep 2014 21:25

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 03:02 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz