Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML Nodevalue liefert leeres Ergebnis (https://www.delphipraxis.net/215569-xml-nodevalue-liefert-leeres-ergebnis.html)

Alfonso 30. Jul 2024 08:58

XML Nodevalue liefert leeres Ergebnis
 
Hallo,
habe folgend Funktion:
Delphi-Quellcode:
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;
Node.Nodevalue liefert immer '' zurück, obwohl node.nodeName mir den richtigen Node anzeigt. Hier ein Beispiel XML:
Code:
<Kunde>
  <Nachname>Abbenseth</Nachname>
  <Vorname>Peter</Vorname>
  <Geschlecht>M</Geschlecht>
</Kunde>
Beim Aufruf von XMLGetValue(XMLnode,'Vorname') erwarte ich als Ergebnis Peter.

Was ist falsch? Wie kann man es anders machen?

Danke im Voraus

rwalper 30. Jul 2024 09:28

AW: XML Nodevalue liefert leeres Ergebnis
 
Ich hatte mich auch mal damit rumgeärgert und verwende seitdem
Delphi-Quellcode:
node.Text

Alfonso 30. Jul 2024 09:36

AW: XML Nodevalue liefert leeres Ergebnis
 
node.Text gibt es nicht bei IDOMNode.

DeddyH 30. Jul 2024 09:53

AW: XML Nodevalue liefert leeres Ergebnis
 
Wenn ich das so mache:
Delphi-Quellcode:
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;
dann wird mir "Peter" ausgegeben.

himitsu 30. Jul 2024 19:13

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 ....

Alfonso 30. Jul 2024 22:01

AW: XML Nodevalue liefert leeres Ergebnis
 
Gelöscht!

Alfonso 30. Jul 2024 22:26

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 https://www.delphipraxis.net/215558-...ml#post1539322)

Also muss ich auf die Delphi Komponenten zurückgreifen, die damit keine Fehler verursachen.
Mein XML hat eine verschachtelte Struktur:

Code:
<?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>
Ich möchte nun durch das gesamt XML gehen und alle Vornamen und Nachnamen ausgeben, egal auf welcher ebene sie sind.
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?

himitsu 31. Jul 2024 02:35

AW: XML Nodevalue liefert leeres Ergebnis
 
Zitat:

bringt bei MSXML leider nichts
Ähhhhhmmmmm, also die Hilfe sagt
https://learn.microsoft.com/en-us/pr...62632(v=vs.85)
: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.
https://learn.microsoft.com/en-us/pr...arser-versions


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:
<!DOCTYPE
zu
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:).

Alfonso 31. Jul 2024 23:21

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, '&nbsp;', ' ', [rfReplaceAll]);
  s := stringreplace(s, '&ndash;', '-', [rfReplaceAll]);
  s := stringreplace(s, '<!DOCTYPE CUSTOMER'#13''#10'['#13''#10'<!ENTITY nbsp "*">'#13''#10''#13''#10'<!ENTITY ndash "–">'#13''#10']>', ' ', [rfReplaceAll]);
end;

himitsu 1. Aug 2024 00:18

AW: XML Nodevalue liefert leeres Ergebnis
 
Die Leerstrings '' im Text sind unnötig
und es gibt ein StringReplace für Schreibfaule.

Delphi-Referenz durchsuchenStringReplace
Delphi-Referenz durchsuchenReplaceStr
Delphi-Referenz durchsuchenReplaceText
Delphi-Referenz durchsuchenstring.Replace

Delphi-Quellcode:
procedure TForm2.EntityLöschen(var s: string);
begin
  s := ReplaceStr(s, '&nbsp;', ' ');
  s := ReplaceStr(s, '&ndash;', '-');
  s := ReplaceStr(s, '<!DOCTYPE CUSTOMER'#13#10'['#13#10'<!ENTITY nbsp "*">'#13#10#13#10'<!ENTITY ndash "&#8211;">'#13#10']>', ' ');
end;
Delphi-Quellcode:
procedure TForm2.EntityLöschen(var s: string);
begin
  //s := s.Replace('&nbsp;', ' ');
  //s := s.Replace('&ndash;', '-');
  //s := s.Replace(s, '<!DOCTYPE CUSTOMER'#13#10'['#13#10'<!ENTITY nbsp "*">'#13#10#13#10'<!ENTITY ndash "&#8211;">'#13#10']>', ' ');
  s := s.Replace('&nbsp;', ' ').Replace('&ndash;', '-').Replace(s, '<!DOCTYPE CUSTOMER'#13#10'['#13#10'<!ENTITY nbsp "*">'#13#10#13#10'<!ENTITY ndash "&#8211;">'#13#10']>', ' ');
end;

Alfonso 1. Aug 2024 08:09

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