![]() |
XML Nodevalue liefert leeres Ergebnis
Hallo,
habe folgend Funktion:
Delphi-Quellcode:
Node.Nodevalue liefert immer '' zurück, obwohl node.nodeName mir den richtigen Node anzeigt. Hier ein Beispiel XML:
function XMLGetValue(XMLNode: IDOMNode; Path: string): string;
var node: IDOMNode; begin node := (XMLNode as IDOMNodeSelect).selectNode(Path); if node = nil then result := '' else result := node.nodeValue; end; Beim Aufruf von XMLGetValue(XMLnode,'Vorname') erwarte ich als Ergebnis Peter. Was ist falsch? Wie kann man es anders machen? Danke im Voraus |
AW: XML Nodevalue liefert leeres Ergebnis
Ich hatte mich auch mal damit rumgeärgert und verwende seitdem
Delphi-Quellcode:
node.Text
|
AW: XML Nodevalue liefert leeres Ergebnis
node.Text gibt es nicht bei IDOMNode.
|
AW: XML Nodevalue liefert leeres Ergebnis
Wenn ich das so mache:
Delphi-Quellcode:
dann wird mir "Peter" ausgegeben.
uses XMLDoc, XMLIntf;
const _XML = ''' <Kunde> <Nachname>Abbenseth</Nachname> <Vorname>Peter</Vorname> <Geschlecht>M</Geschlecht> </Kunde> '''; procedure TForm5.FormCreate(Sender: TObject); var lDoc: IXMLDocument; lParentNode: IXMLNode; lChildNode: IXMLNode; begin lDoc := NewXMLDocument; lDoc.LoadFromXML(_XML); lDoc.Active := true; lParentNode := lDoc.DocumentElement; if Assigned(lParentNode) then begin lChildNode := lParentNode.ChildNodes.FindNode('Vorname'); if Assigned(lChildNode) then ShowMessage(lChildNode.NodeValue); end; end; |
AW: XML Nodevalue liefert leeres Ergebnis
selectNode/selectNodes ist für XPath.
Bei so einem einfachen "Unterknoten" geht es natürlich auch ohne, aber falls es doch verschachtelter wird .... |
AW: XML Nodevalue liefert leeres Ergebnis
Gelöscht!
|
AW: XML Nodevalue liefert leeres Ergebnis
Also, ich glaube ich muss weiter ausholen, da alles irgendwie nicht funktioniert. Früher habe ich mit MSXML direkt erfolgreich gearbeitet. Leider habe ich jetzt eine XML Datei mit einem DTD und Xml.Win.msxmldom.MSXMLDOMDocumentFactory.AddDOMPro perty ('ProhibitDTD', False); bringt bei MSXML leider nichts.
(siehe ![]() Also muss ich auf die Delphi Komponenten zurückgreifen, die damit keine Fehler verursachen. Mein XML hat eine verschachtelte Struktur:
Code:
Ich möchte nun durch das gesamt XML gehen und alle Vornamen und Nachnamen ausgeben, egal auf welcher ebene sie sind.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Customer [ <!ENTITY nbsp "*"> <!ENTITY shy "*"> ]> <Customer> <Kunde> <Nachname>Abbenseth</Nachname> <Vorname>Peter</Vorname> <Geschlecht>M</Geschlecht> <Kunde> <Nachname>Schmitt</Nachname> <Vorname>Klaus</Vorname> <Geschlecht>M</Geschlecht> </Kunde> </Kunde> <Kunde> <Nachname>Mueller</Nachname> <Vorname>Alf</Vorname> <Geschlecht>M</Geschlecht> <Kunde> <Nachname>Otto</Nachname> <Vorname>Maria</Vorname> <Geschlecht>W</Geschlecht> </Kunde> </Kunde> </Customer> mit MSXML hatte ich mit selectnodes ('//Kunde') alle Knoten als XML Liste erhalten und konnte dann jedes Element auslesen. XPath geht scheinbar jetzt nicht. Wer kann mir helfen? |
AW: XML Nodevalue liefert leeres Ergebnis
Zitat:
![]() :gruebel: Aber vielleicht bezieht es sich auch nur auf DTD via URL, welche dann nicht geladen werden. (das innerhalb der XML ist ja bereits geladen worden) Oder eine andere Version des MSXML-DOM nutzen? Aber eigentlich dürfte es aktuell bereits eine v6 sein. ![]() Nja, man könnte notfalls vorher noch böse mit StringReplace oder RegEx am XML-Text rumpfuschen :duck:, also das Störende auskommentieren oder rauslöschen.
Delphi-Quellcode:
zu
<!DOCTYPE
Delphi-Quellcode:
<!--DOCTYPE
Delphi-Quellcode:
zu
]>
Delphi-Quellcode:
]-->
Oder es alternativ mit ISAXXMLReader versuchen und dort könnte man sich dann auch via ISAXDTDHandler noch reinhängen und es abfangen, falls es dort ebenfalls knallt. Oder halt eine andere XML-Lib (gibt auch welche in Delphi geschrieben, wo sich fast niemand die Mühe gemacht hat DTD überhaupt zu implementieren :stupid:). |
AW: XML Nodevalue liefert leeres Ergebnis
Vielen Dank für eure Unterstützung. Habe mich für MSXML entschieden und mit diese Proc die Entities gelöscht.
Delphi-Quellcode:
procedure TForm2.EntityLöschen(var s: string);
begin s := stringreplace(s, ' ', ' ', [rfReplaceAll]); s := stringreplace(s, '–', '-', [rfReplaceAll]); s := stringreplace(s, '<!DOCTYPE CUSTOMER'#13''#10'['#13''#10'<!ENTITY nbsp "*">'#13''#10''#13''#10'<!ENTITY ndash "–">'#13''#10']>', ' ', [rfReplaceAll]); end; |
AW: XML Nodevalue liefert leeres Ergebnis
Die Leerstrings '' im Text sind unnötig
und es gibt ein StringReplace für Schreibfaule. ![]() ![]() ![]() ![]()
Delphi-Quellcode:
procedure TForm2.EntityLöschen(var s: string);
begin s := ReplaceStr(s, ' ', ' '); s := ReplaceStr(s, '–', '-'); s := ReplaceStr(s, '<!DOCTYPE CUSTOMER'#13#10'['#13#10'<!ENTITY nbsp "*">'#13#10#13#10'<!ENTITY ndash "–">'#13#10']>', ' '); end;
Delphi-Quellcode:
procedure TForm2.EntityLöschen(var s: string);
begin //s := s.Replace(' ', ' '); //s := s.Replace('–', '-'); //s := s.Replace(s, '<!DOCTYPE CUSTOMER'#13#10'['#13#10'<!ENTITY nbsp "*">'#13#10#13#10'<!ENTITY ndash "–">'#13#10']>', ' '); s := s.Replace(' ', ' ').Replace('–', '-').Replace(s, '<!DOCTYPE CUSTOMER'#13#10'['#13#10'<!ENTITY nbsp "*">'#13#10#13#10'<!ENTITY ndash "–">'#13#10']>', ' '); end; |
AW: XML Nodevalue liefert leeres Ergebnis
... und wieder was gelernt.
Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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 by Thomas Breitkreuz