Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML-Dateien per ReadLn einlesen (https://www.delphipraxis.net/153651-xml-dateien-per-readln-einlesen.html)

devidespe 11. Aug 2010 10:21

XML-Dateien per ReadLn einlesen
 
Hallo,

ich möchte die XML-Dateien der Windows-Leistungsbewertung in Delphi auswerten und benutze dazu AssignFile, Reset, und ReadLn.

Leider liefert ReadLn folgendes zurück:

ÿþ<'#0'?'#0'x'#0'm'#0'l'#0' '#0'v'#0'e'#0'r'#0's'#0'i'#0'o'#0'n'#0'='#0'"'#0'1 '#0'.'#0'0'#0'"'#0

und das sollte eigentlich zurückkommen:

<?xml version="1.0">

Aus irgendeinem Grund wird nach jedem Zeichen '#0' eingefügt. Hat dafür jemand eine Erklährung? Wie kann ich das ändern?

Danke und Gruß

xZise 11. Aug 2010 10:23

AW: XML-Dateien per ReadLn einlesen
 
Die Datei ist UTF16 kodiert, und du packst das in einen Ansistring. Deshalb die beiden komischen Zeichen am Anfang (siehe Byte Order Mark).

Pack das Ganze in einen WideString, dann müsste es eigentlich gehen.

MfG
Fabian

Bernhard Geyer 11. Aug 2010 10:25

AW: XML-Dateien per ReadLn einlesen
 
XML-Dateien sollten über entsprechender XML-Komponenten/Parser geladen werden. Oder willst du die ganzen Regeln bzgl. Entities/Codierung selbst nachimplementieren?

devidespe 11. Aug 2010 10:37

AW: XML-Dateien per ReadLn einlesen
 
Zitat:

Zitat von xZise (Beitrag 1041055)
Die Datei ist UTF16 kodiert, und du packst das in einen Ansistring. Deshalb die beiden komischen Zeichen am Anfang (siehe Byte Order Mark).

Pack das Ganze in einen WideString, dann müsste es eigentlich gehen.

MfG
Fabian

Wenn ich anstatt String den WideString nehme, ändert das leider nichts am Ergebnis. Vielleicht liegts an ReadLn?

Ich wollte eigentlich keine kompletten XML-Strukturen verarbeiten, sondern lediglich 2 Werte auslesen. Dafür einen eigenen XML-Parser zu verwenden, schien mir zu aufwendig.

Bernhard Geyer 11. Aug 2010 10:41

AW: XML-Dateien per ReadLn einlesen
 
Zitat:

Zitat von devidespe (Beitrag 1041061)
Wenn ich anstatt String den WideString nehme, ändert das leider nichts am Ergebnis. Vielleicht liegts an ReadLn?

ReadLn dürfte das AFAIK nur ab D2009 können.

Zitat:

Zitat von devidespe (Beitrag 1041061)
Ich wollte eigentlich keine kompletten XML-Strukturen verarbeiten, sondern lediglich 2 Werte auslesen. Dafür einen eigenen XML-Parser zu verwenden, schien mir zu aufwendig.

Und? Wie willst du diese erkennen? Ich kann dir problemlos deine XML so verändern das deine Erkennung fehl schlägt (z.B. deine gesuchten Tags geschickt in XML-Kommentare einpacken oder dies als Teil eines CData-Segmentes auftauchen lassen.

Nimm dir etwas Zeit und mach die Lösung vernünftig! Du sparst dir damit sehr viel Aufwand bezüglich Fehlersuche und Stress.

devidespe 11. Aug 2010 10:44

AW: XML-Dateien per ReadLn einlesen
 
Welchen XML-Parser würdest Du denn vorschlagen? Es geht wirklich nur ums Suchen und Auslesen von XML-Attributen, nicht um Änderungen. Also irgend etwas einfaches...

stahli 11. Aug 2010 10:56

AW: XML-Dateien per ReadLn einlesen
 
Wenn Du eine IDE-Komponente nutzen willst, geht wohl am einfachsten:

Delphi-Quellcode:
Result := (XmlDocument1.DOMDocument as IDOMNodeSelect).selectNode(XPath).childNodes[0].nodeValue


Dann kannst Du sogar XPath nutzen :-)
Das setzt allerdings voraus, dass der Knoten existiert und keinen Leerstring enthält - sonst gibt es einen Fehler.

Daher bin ich hier gerade auf der Suche nach einer flexibleren Alternative.

himitsu 11. Aug 2010 11:05

AW: XML-Dateien per ReadLn einlesen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1041064)
ReadLn dürfte das AFAIK nur ab D2009 können.

Die alten Pascal-Funktionen um AssingFile sind und blieben, auch mit Umstellung auf Delphi2009/Unicode, immernoch Ansi.

Selbst in Delphi 7 kennt ReadLn WideString-Variablen.
Aber die Datei wird immer als ANSI interpretiert.
Es sei den man stellt die entsprechende WinAPI auf OEM um, dann kennt sie stattdessen den alten OEM-Zeichensatz (DOS).

PS: meinem Hier im Forum suchenhimXML-Download sind noch einige andere XML-Libs mit beigelegt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:08 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