AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

XML auslesen

Ein Thema von Michael0508 · begonnen am 16. Feb 2014 · letzter Beitrag vom 29. Sep 2014
Antwort Antwort
Seite 1 von 2  1 2      
Michael0508

Registriert seit: 10. Dez 2013
2 Beiträge
 
#1

XML auslesen

  Alt 16. Feb 2014, 01:55
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>
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: XML auslesen

  Alt 16. Feb 2014, 02:38
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#3

AW: XML auslesen

  Alt 16. Feb 2014, 15:31
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;

Geändert von hathor (16. Feb 2014 um 15:34 Uhr)
  Mit Zitat antworten Zitat
Michael0508

Registriert seit: 10. Dez 2013
2 Beiträge
 
#4

AW: XML auslesen

  Alt 16. Feb 2014, 19:28
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
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: XML auslesen

  Alt 25. Sep 2014, 21:25
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!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
670 Beiträge
 
#6

AW: XML auslesen

  Alt 25. Sep 2014, 21:55
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)
Achtung: Bin kein Informatiker sondern komme vom Bau.

Geändert von Jens01 (25. Sep 2014 um 21:59 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: XML auslesen

  Alt 26. Sep 2014, 09:56
OmniXML ist nun auch Teil von Delphi (XE7)
Markus Kinzler
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
670 Beiträge
 
#8

AW: XML auslesen

  Alt 26. Sep 2014, 11:46
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.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: XML auslesen

  Alt 26. Sep 2014, 20:38
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.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#10

AW: XML auslesen

  Alt 26. Sep 2014, 21:25
Ä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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr.
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