AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi XML Nodevalue liefert leeres Ergebnis
Thema durchsuchen
Ansicht
Themen-Optionen

XML Nodevalue liefert leeres Ergebnis

Ein Thema von Alfonso · begonnen am 30. Jul 2024 · letzter Beitrag vom 1. Aug 2024
Antwort Antwort
Seite 1 von 2  1 2      
Alfonso

Registriert seit: 10. Jan 2006
250 Beiträge
 
Delphi 11 Alexandria
 
#1

XML Nodevalue liefert leeres Ergebnis

  Alt 30. Jul 2024, 08:58
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
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!
  Mit Zitat antworten Zitat
rwalper

Registriert seit: 6. Sep 2006
48 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: XML Nodevalue liefert leeres Ergebnis

  Alt 30. Jul 2024, 09:28
Ich hatte mich auch mal damit rumgeärgert und verwende seitdem node.Text
  Mit Zitat antworten Zitat
Alfonso

Registriert seit: 10. Jan 2006
250 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: XML Nodevalue liefert leeres Ergebnis

  Alt 30. Jul 2024, 09:36
node.Text gibt es nicht bei IDOMNode.
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: XML Nodevalue liefert leeres Ergebnis

  Alt 30. Jul 2024, 09:53
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: XML Nodevalue liefert leeres Ergebnis

  Alt 30. Jul 2024, 19:13
selectNode/selectNodes ist für XPath.

Bei so einem einfachen "Unterknoten" geht es natürlich auch ohne, aber falls es doch verschachtelter wird ....
$2B or not $2B
  Mit Zitat antworten Zitat
Alfonso

Registriert seit: 10. Jan 2006
250 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: XML Nodevalue liefert leeres Ergebnis

  Alt 30. Jul 2024, 22:01
Gelöscht!
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!

Geändert von Alfonso (30. Jul 2024 um 22:05 Uhr)
  Mit Zitat antworten Zitat
Alfonso

Registriert seit: 10. Jan 2006
250 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: XML Nodevalue liefert leeres Ergebnis

  Alt 30. Jul 2024, 22:26
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?
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: XML Nodevalue liefert leeres Ergebnis

  Alt 31. Jul 2024, 02:35
Zitat:
bringt bei MSXML leider nichts
Ähhhhhmmmmm, also die Hilfe sagt
https://learn.microsoft.com/en-us/pr...62632(v=vs.85)


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 ,
also das Störende auskommentieren oder rauslöschen.
<!DOCTYPE zu <!--DOCTYPE
]> zu ]-->



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 ).
$2B or not $2B

Geändert von himitsu (31. Jul 2024 um 03:01 Uhr)
  Mit Zitat antworten Zitat
Alfonso

Registriert seit: 10. Jan 2006
250 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: XML Nodevalue liefert leeres Ergebnis

  Alt 31. Jul 2024, 23:21
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;
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: XML Nodevalue liefert leeres Ergebnis

  Alt 1. Aug 2024, 00:18
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 "–">'#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 "–">'#13#10']>', ' ');
  s := s.Replace('&nbsp;', ' ').Replace('&ndash;', '-').Replace(s, '<!DOCTYPE CUSTOMER'#13#10'['#13#10'<!ENTITY nbsp "*">'#13#10#13#10'<!ENTITY ndash "–">'#13#10']>', ' ');
end;
$2B or not $2B

Geändert von himitsu ( 1. Aug 2024 um 00:22 Uhr)
  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 21:42 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