[gelöst] XML Datei erstellen

8. Juli 2009 15:56

Hallo zusammen, kann mir jemand dabei helfen, eine XML Datei aus Navision 3.70a zu erstellen.
Ich brauche einen Export bestimmter Daten damit ich sie in Sie als XML in eine ATLAS (Ausfuhrerklärung) Software einlesen kann.

Ich habe versucht über einen report eine TextDatei zu erstellen, die alle Tags und Werte beinhaltet die ich brauche. Leider lässt diese sich nicht als XML öffnen da sie nicht XML konform ist (OK, hätte ich mir auch denken können).

Hier ein Ausschnitt einer Funktionierender XML: (Einrückungen fehlen)

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<ATLAS>
<Nachricht>
<Zollnummer_Sender>2235420</Zollnummer_Sender>
usw...

Hier ein Ausschnitt einer NICHT funktionierender XML: (Einrückungen fehlen)

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<ATLAS>
<Nachricht>
<Zollnummer_Sender>2235420</Zollnummer_Sender>
usw...

Ja genau, die sehen gleich aus. Im Hex Editor wird aber klar wo die unterschiede liegen:

Die XML-konforme Datei hat bei den 2 ersten Byte der Dater die Hex-Werte 'FF' und 'FE'. Gesagt, getan und schwupps stelle ich diese Werte über einen CHAR auch ganz vorne. Nun zeigt der Hex-Editor ebenfalls das zwischen JEDEM Byte der Hex-Wert '00' einzufügen ist. Das möchte ich auch gerne machen, leider macht mir das Navision nicht wenn ich den Wert im CHAR in der Datei schreibe. Das (NULL-)Byte wird einfach weggelassen und somit habe ich wiederum keine XML-Konforme Datei.

Weiß jemand, wie ich das Problem lösen kann oder wie ich in NAVI 3.70a eine XML erstellen kann, in der ich meine eigenen TAGS und Inhalte definieren kann?
Zuletzt geändert von Perfi am 13. Juli 2009 15:25, insgesamt 1-mal geändert.

Re: XML Datei erstellen

8. Juli 2009 16:04

Hi,

ich habe das für Atlas bei uns problemlos über eine Codeunit gelöst.

Ich kann dir dafür folgende Sachen nahe legen:

Automation -- 'Microsoft XML, v3.0'.DOMDocument
Automation -- 'Microsoft XML, v3.0'.IXMLDOMNode
Codeunit -- XML DOM Mgmt.

Versuch es doch mal damit.
Aber wieso du bei deiner Lösung über Report "falsche" HEX-Werte kann ich mir icht erklären.
Nutzt du vielleicht andere Automation-Server als ich?

Re: XML Datei erstellen

8. Juli 2009 17:03

Hallo,

danke für die schnelle antwort. Sie ist mir sehr hilfreich.

Ich habe mir eben die Codeunit angeschaut. Ich denke es kann damit auch klappen. Nur sind die Automation Server eine neue Navision Landschaft für mich.
Müssen die Daten dann über einen OutStream gejagt werden? Wenn ja, wie mache ich das?

Re: XML Datei erstellen

8. Juli 2009 17:17

Wenn mich nicht alles täuscht, dann hat das DOMDocument eine Methode save().

Re: XML Datei erstellen

10. Juli 2009 08:30

Ich gebe dir einmal ein paar Auszüge aus einem Beispiel:
XMLDomDocument ist dabei mein 'Microsoft XML, v3.0'.DOMDocument
CurrNode ist 'Microsoft XML, v3.0'.IXMLDOMNode
Code:
IF NOT CREATE(XMLDOMDocument) THEN
  EXIT(FALSE);
...
XMLDOMDocument.loadXML := '<ATLAS/>';  //erster Tag
CurrNode := XMLDOMDocument.documentElement;
...
  IF XMLDOMDocument.AddElement(CurrNode,'NAME','WERT',DocNameSpace,NewChild) > 0 THEN
    EXIT(FALSE);
....
XMLDOMDocument.save(Path); // speichern der XML

Re: XML Datei erstellen

10. Juli 2009 09:35

Hallo Perfi,

wenn ich mich recht entsinne, werden das CR/LF (Zeichen 10 & 13, glaube ich) automatisch eingefügt. Ich habe es "ausgetrickst" in dem ich per SEEK -2 zeichen zurück gehe. (Im Texteditor ist die XML Datei ohne "CR", daher ohne Zeilenumbrüche)


So in der Art sieht mein Code aus:
(Einrückungen werden nicht benötigt!)
Code:
{
Variablen:
Name      DataType      Length
XMLVerzeichnis   Text      229
XMLFileName   Text      30
XMLFile      File      
DateiOffen   Boolean   
}
XMLFile.QUERYREPLACE(TRUE);
DateiOffen := XMLFile.CREATE(XMLVerzeichnis+XMLFileName);

  IF DateiOffen THEN BEGIN
    XMLFile.TEXTMODE(TRUE);
    XMLFile.WRITE('<?xml version="1.0" encoding="utf-8"?>');
    XMLFile.WRITE('<xml-data xmlns="http://www.lucom.com/ffw/xml-data-1.0.xsd">');
    XMLFile.SEEK(XMLFile.POS-2);
    XMLFile.WRITE('<form>catalog://Unternehmen/ust/ZM_Formular_online</form>');
    XMLFile.SEEK(XMLFile.POS-2);
  ...


Sieht zwar nicht schön aus, aber funktioniert :-)
(Vorher hatte ich auch das Problem, das die Datei zwar im IE angezeigt wurde, jedoch beim Upload ein Fehler auftrat!)
-->Der Weg über Automation ist der Elegantere, jedoch muss "man" sich erst hier einarbeiten.

Re: XML Datei erstellen

10. Juli 2009 14:01

Hallo Django,

es ist am Anfang nicht so einfach das Prinzip zu verstehen aber deine Beispiele haben mir gut weitergeholfen.
Das Problem ist einfach, dass es zuviele Parameter/Befehle bei der Automation gibt, die nirgenswo dokumentiert sind und es ist echt eine Lebensaufgabe es selber rauszufinden. Oder hast Du vielleicht im Internet vernüftige Quellen gefunden?

Ich habe mal folgendes geschrieben:
Code:
//XMLDom        Codeunit     XML DOM Management
//XMLDomDoc     Automation   'Microsoft XML, v3.0'.DOMDocument   
//XMLDomNode    Automation   'Microsoft XML, v3.0'.IXMLDOMNode   
//Newchild      Automation   'Microsoft XML, v3.0'.IXMLDOMElement   

IF NOT CREATE(XMLDomDoc) THEN
   EXIT;

XMLDomDoc.loadXML := '<ATLAS/>';
XMLDomNode        := XMLDomDoc.documentElement;
Newchild          := XMLDomDoc.documentElement;

IF XMLDom.AddElement(Newchild, 'Nachricht', '', '', XMLDomNode) > 0 THEN
   EXIT;
IF XMLDom.AddElement(XMLDomNode, 'Zollnummer_Sender', '321', '', Newchild) > 0 THEN
   EXIT;
IF XMLDom.AddElement(XMLDomNode, 'Nachrichten_Typ', 'DEXPDA', '', Newchild) > 0 THEN
   EXIT;
IF XMLDom.AddElement(XMLDomNode, 'BEO_Atlas_KundenID', '651651', '', Newchild) > 0 THEN
   EXIT;

XMLDomDoc.save('c:\stream.xml');

Das ergibt folgende Ansicht in IE:
Code:
<BEO_ATLAS>
    <NACHRICHT>
        <ZOLLNUMMER_SENDER>321</ZOLLNUMMER_SENDER>
        <NACHRICHTEN_TYP>DEXPDA</NACHRICHTEN_TYP>
        <BEO_ATLAS_KUNDENID>651651</BEO_ATLAS_KUNDENID>
    </NACHRICHT>
</BEO_ATLAS>

damit bin ich ziemlich zufrieden. Ist es denn der richtige syntaxische Weg, oder habe ich etwas übersehen?
Mir ist die Funktion von Newchild nicht so klar. Wofür wird dieser Parameter gebraucht? Habe ich es richtig als Element deklariert und nicht als node?




Hallo Mikka,

tatsächlich werden die Zeichen CR/LF (13+10 Dez bzw. 0D+0A Hex) automatisch am Ende des Datensatzes eingetragen, wenn man einen Datei.WRITE Befehl ausführ. Da kann manchmal störend sein.
Aber deine Methode die 2 letzten Zeichen wieder zu löschen ist auch nicht schlecht. Ist nicht elegant, aber sie funktioniert ja !!!

Ich habe auch den TEXTMODE(FALSE) ausprobiert um die Datei binär zu öffnen. Aber da reagiert Navision sehr komisch, denn mit dem Befehl Datei.WRITE(Variable) wird die Variable als Text in der Zeile geschrieben und die Zeile mit NULL (00 Hex) gefüllt bis zur Länge der Variable.

Re: XML Datei erstellen

10. Juli 2009 15:59

Ich hab leider keine Quelle im Internet gefunden.
Mir blieb auch nur rumzuprobieren und Kollegen zu fragen.
Dein Code sieht aber soweit ganz gut aus.
Ich schreib dir mal hier eine komplette Struktur.
Dann wird denk ich ganz gut ersichtlich wie du mit den Childs arbeiten kannst.

Code:
Name   DataType   Subtype   Length
XMLDOMDocument   Automation   'Microsoft XML, v3.0'.DOMDocument   
CurrNode   Automation   'Microsoft XML, v3.0'.IXMLDOMNode   
NewChild   Automation   'Microsoft XML, v3.0'.IXMLDOMNode   
XMLDOMManagement   Codeunit   XML DOM Mgmt.   
DocNameSpace   Text      200

CLEAR(XMLDOMDocument);
IF NOT CREATE(XMLDOMDocument) THEN
  EXIT(FALSE);

XMLDOMDocument.loadXML := '<ATLAS/>';
CurrNode := XMLDOMDocument.documentElement;
DocNameSpace := '';
WITH XMLDOMManagement DO BEGIN

///////////
//NACHRICHT
///////////

  IF AddElement(CurrNode,'Nachricht','',DocNameSpace,NewChild) > 0 THEN
    EXIT(FALSE);

  CurrNode := NewChild;  // Neues Child damit die kommenden Elemente alle in Nachricht sind

    IF AddElement(CurrNode,'FELD','WERT',DocNameSpace,NewChild) > 0 THEN
      EXIT(FALSE);
    IF AddElement(CurrNode,'FELD2','WERT',DocNameSpace,NewChild) > 0 THEN
      EXIT(FALSE);
    IF AddElement(CurrNode,'FELD3','WERT',DocNameSpace,NewChild) > 0 THEN
      EXIT(FALSE);
    CurrNode := NewChild;  // neues Child damit die kommenden Felder in FELD3 sind
      IF AddElement(CurrNode,'FELD','WERT',DocNameSpace,NewChild) > 0 THEN
        EXIT(FALSE);
    CurrNode := CurrNode.parentNode;  // zurück springen mit CurrNoce in Nachricht
    IF AddElement(CurrNode,'FELD','WERT',DocNameSpace,NewChild) > 0 THEN   // ist wieder im Element Nachricht
      EXIT(FALSE); 

  CurrNode := CurrNode.parentNode; // aus NAchricht rausspringen

//////
//KOPF
//////

  IF AddElement(CurrNode,'Kopf','',DocNameSpace,NewChild) > 0 THEN
    EXIT(FALSE);

  CurrNode := NewChild;  // in Kopf reinspringen

    IF AddElement(CurrNode,'FELD','WERT',DocNameSpace,NewChild) > 0 THEN
      EXIT(FALSE);

  CurrNode := CurrNode.parentNode;  // rausspringen aus Kopf

///////
//WAREN
///////

  IF AddElement(CurrNode,'Waren','',DocNameSpace,NewChild) > 0 THEN
    EXIT(FALSE);

  CurrNode := NewChild;  // reinspringen in Waren
    IF AddElement(CurrNode,'FELD','WERT',DocNameSpace,NewChild) > 0 THEN
      EXIT(FALSE); 

  CurrNode := CurrNode.parentNode;  // rausspringen aus Waren

  XMLDOMDocument.save(Path);  // speichern
END;

Re: XML Datei erstellen

10. Juli 2009 16:55

Perfi hat geschrieben:Hallo Django,
Oder hast Du vielleicht im Internet vernüftige Quellen gefunden?


Evtl hilft dieser Link dir weiter:
http://msdn.microsoft.com/de-de/default.aspx
Suche nach XML.

Leider ist diese Wissensfundgrube gigantisch groß, evtl. hast du Glück. :roll:
z.B. Für Excel tolle Referenzen: http://msdn.microsoft.com/en-us/library/aa221100(office.11).aspx

Falls du etwas brauchbares findest, wäre es sehr nett von Dir / Euch uns daran teil haben zu lassen :-)
Zuletzt geändert von Natalie am 13. Juli 2009 16:49, insgesamt 1-mal geändert.
Grund: quote-Tag geschlossen

Re: XML Datei erstellen

13. Juli 2009 15:24

Danke an euch.

Ich werde bei gelegenheit versuchen tiefgründige Infos über diese Automation zu finden. Natürlich stelle ich euch dann gerne die ergebnisse zur Verfügung.

Gruß
Perfi