Autor Beitrag
Markus123
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 35


Delphi 2007
BeitragVerfasst: Mo 21.02.05 15:22 
Hallo zusammen,

ich versuche aus einer XML-Datei (die ich bekomme) Daten auszuwerten. Folgender XML-Datei-Aufbau:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
<docu:docu xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:docu/go/001" xmlns:docu="urn:docu/001" docu_version="1.50">
 <docu:header>
   [...]
 </docu:header>
 <docu:body>
   [...]
 </docu:body>
</docu:docu>


Nun stört aber anscheinend das mit den Doppelpunkten als Knotennamen, denn ein selectSingleNode('docu:docu/docu:header') schlägt fehl. Wenn ich mit firstChild zugreife kann ich wunderbar navigieren - aber das ist ein wenig umständlich...

Ich verwendet MSXML4 unter Delphi4 Pro und Windows 2000.

Kann mir jemand helfen? Die Doppelpunkte kann ich leider nicht ersetzen, also muss ich damit leben. Was tun? :?:

Grüße,
Markus
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mo 21.02.05 15:26 
Markus123 hat folgendes geschrieben:
Die Doppelpunkte kann ich leider nicht ersetzen, also muss ich damit leben. Was tun? :?:


Gar nichts. Meines Wissens nach sind Doppelpunkte in "Bezeichnern" (oder wie das auch immer in XML heißt) nicht gestattet.

AXMD
Markus123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 35


Delphi 2007
BeitragVerfasst: Mo 21.02.05 15:42 
Hi,

dachte ich eigentlich auch - aber schau dir www.w3.org/2001/XMLSchema-instance mal an...

Grüße,
Markus
Chris1308
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 220

Win XP Prof.
D2005 Prof, D7 Prof, D7 Pers
BeitragVerfasst: Mo 21.02.05 16:09 
Hi,
ich habe mir den Link nicht angeguckt, aber bei den Bezeichnern handelt es sich um Namespace. Diese musst du allerdings vorher explizit deklarieren. Ich weiß nicht, wie du darauf zugreifest, aber ich hatte das gleiche Problem, als ich mit Hilfe von MS XML auf RDF-Feeds zugreifen wollte. Ich habe jetzt keinen direkt Link, musst also mal in der Suche in der Delphi-PRAXiS DP SUCHEN.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 21.02.05 16:16 
So sollte es gehen. Die Betonung liegt auf sollte, weil ich so was schon einige Zeit nicht mehr mit Delphi gemacht habe
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
const
  DocuNamespace    = 'xmlns:docu="urn:docu/001"';
begin
  // XML-Dokument erzeugen
  { ... }

  // Namespace setzen
  xmldoc.SetProperty("SelectionNamespaces",DocuNamespace);

  // XML-Datei laden
  xmldoc.Load("blabla.xml");

  // Knoten suchen
  node = xmldoc.selectSingleNode("/docu:docu/docu:header");
  ShowMessage(node.xml);


  { ... }
end;
Markus123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 35


Delphi 2007
BeitragVerfasst: Mo 21.02.05 16:20 
Hallo zusammen,

der Namespace also! Funktioniert perfekt! :D

Danke!
Markus
Markus123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 35


Delphi 2007
BeitragVerfasst: Di 22.02.05 08:40 
Titel: Doch noch eine Frage...
Hallo zusammen,

ich bin's wieder :roll:

Ich krieg hier noch die Krise! Also Elemente der Form docu:docu lassen sich wunderbar lassen - nur verlassen ihn nun die Geister bei "normalen" Elementbezeichnungen.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
<docu:docu xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:docu/go/001" xmlns:docu="urn:docu/001" docu_version="1.50">  
 <docu:header>  
   [...]  
 </docu:header>  
 <docu:body>
   <name>
     [...]
   </name>
   [...]  
 </docu:body>  
</docu:docu>


Der 'name' lässt sich jetzt nicht mehr finden. Bis zu 'docu:body' geht's, danach ist es aus. Muss ich 'SelectionNamespaces' wieder ändern?

<Ergänzung>
Während xmlDoc.documentElement.selectSingleNode('//docu:body'); funktioniert schlägt xmlDoc.documentElement.selectSingleNode('//name'); fehl...
</Ergänzung>

Grüße,
Markus

PS: Wenn ich den erwische, der diese XML-Datei definiert hat, gibt's saures! :twisted:
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 22.02.05 11:44 
Titel: Re: Doch noch eine Frage...
Es schlägt deshalb fehl, weil die "normalen" Knoten auch einen Namespace haben:
Markus123 hat folgendes geschrieben:
ausblenden Quelltext
1:
<docu:docu ... xmlns="urn:docu/go/001" ...>					

Du musst jetzt wieder eine Namespace-Deklaration verwenden. Da es aber ohne Präfix IMHO nicht geht, denkst du dir selbst einen aus, bspw.
ausblenden Delphi-Quelltext
1:
2:
const
  NormalNamespace = 'xmlns:normal="urn:docu/go/001"';

Den übergibst du auch an das XML-Dokument (so wie du das schon beim ersten Namespace gemacht hast), und dann benutzt du den Präfix "normal:" beim Suchen nach Knoten. Musst du mal ausprobieren. Notfalls einen Blick in die XML-Dokumentation von Microsoft (MSDN, PSDK, MS-XML-Paket) werfen.
Markus123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 35


Delphi 2007
BeitragVerfasst: Di 22.02.05 15:50 
Ich hatte es mir ja schon fast gedacht, dass dieser zusätzliche Namespace irgendetwas sein muss - aber ohne Namen ging natürlich nichts. Auf die Idee, einfach einen Namen zu vergeben bin ich natürlich nicht gekommen... :shock:

Danke für deine Hilfe - die Peitsche für den Urheber dieser XML-Datei liegt schon griffbereit! Der soll nur kommen!!! :twisted:

Grüße,
Markus