[Gelöst] XML-Datei mit Namespace importieren

18. Mai 2018 09:28

Hallo zusammen,

ich bin neu hier und möchte gerne ein Problem schildern.
Es geht um den Import einer XML-Datei mit Namespace (unter Verwendung von DotNet-Variablen). Nachfolgend ist das Beispiel erläutert:

XML-Datei:
==========
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Nachricht xmlns="www.example.com">
   <Nachrichtenkopf>
   ...
   </Nachrichtenkopf>
   <Inhalt>
      <Betrag>12</Betrag>
      <Nummer>45</Nummer>
   </Inhalt>
   <Inhalt>
      <Betrag>67</Betrag>
      <Nummer>89</Nummer>
   </Inhalt>
</Nachricht>


C/AL-Variablen:
==============
Code:
lXMLDOMDocument         DotNet      System.Xml.XmlDocument - System.Xml
lXMLNameSpaceManager    DotNet      System.Xml.XmlNamespaceManager - System.Xml
lCurrNode               DotNet      System.Xml.XmlNode - System.Xml
lNodeListElement        DotNet      System.Xml.XmlNode - System.Xml
lXMLNodeList            DotNet      System.Xml.XmlNodeList - System.Xml
lNamespace              Text
lNamespaceURI           Text
lServerFilePath         Text
lCounter                Integer


C/AL-Code:
==========
Code:
lXMLDOMDocument := lXMLDOMDocument.XmlDocument();
lXMLDOMDocument.Load(lServerFilePath);

lXMLNameSpaceManager := lXMLNameSpaceManager.XmlNamespaceManager(lXMLDOMDocument.NameTable);
lNamespaceURI := lXMLDOMDocument.DocumentElement.NamespaceURI;
IF lNamespaceURI <> '' THEN BEGIN
  lNamespace := 'xf:';
  lXMLNameSpaceManager.AddNamespace('xf',lNamespaceURI);
END ELSE
  lNamespace := '';
 
lXMLNodeList := lXMLDOMDocument.GetElementsByTagName('Inhalt');

IF lXMLNodeList.Count() > 0 THEN BEGIN
  REPEAT 
    lNodeListElement := lXMLNodeList.Item(lCounter);
    lCurrNode := lNodeListElement.SelectSingleNode('//' + lNamespace + 'Nummer',lXMLNameSpaceManager);
    MESSAGE(lCurrNode.InnerText);
    lCounter += 1;
  UNTIL lCounter >= lXMLNodeList.Count();
END;


Es werden, wie gewünscht, zwei Message-Boxen geöffnet, nur leider jedesmal mit dem Wert "45". Erwartet hätte ich zuerst den Wert "45" und dann den Wert "89".
Was habe ich übersehen, damit es wie gewünscht funktioniert? Kann mir jemand helfen?
Zuletzt geändert von niehaves am 18. Mai 2018 11:09, insgesamt 7-mal geändert.

Re: XML-Datei mit Namespace importieren

18. Mai 2018 10:11

Hallo niehaves,

dein Quelltext ist leichter zu lesen und zu verstehen, wenn du ihn zwischen so genannte Code-Tags setzt. Insbesondere deine Formatierungen werden so auch beibehalten.

Daher bitten wir dich, vor und nach deinem Quelltext diese Code-Tags einzufügen. Beispiel:


[code]Dein Quelltext[/code]

Gruß, Kowa
MSDynamics.de-Team


P.S. Herzlich willkommen im Forum!

Re: XML-Datei mit Namespace importieren

18. Mai 2018 10:23

Danke für den Hinweis und den Willkommensgruß. Ich habe den Code nun entsprechend markiert.

Re: XML-Datei mit Namespace importieren

18. Mai 2018 10:56

Hallo,
der Fehler liegt hier:
Code:
lCurrNode := lNodeListElement.SelectSingleNode('//' + lNamespace + 'Nummer',lXMLNameSpaceManager);


Du gehst immer vom Root aus (//) und die erste Node ist immer die mit dem Wert 45.

Probier es mal so
Code:
lCurrNode := lNodeListElement.SelectSingleNode('./' + lNamespace + 'Nummer',lXMLNameSpaceManager);


Gruß
Christoph

Re: XML-Datei mit Namespace importieren

18. Mai 2018 11:07

Hallo Christoph,

danke für Deinen Vorschlag. Ich habe es probiert und es funktioniert jetzt. Klasse. Besten Dank!!!

Beste Grüße