XML Namespace issue

FlorisB1984FlorisB1984 Member Posts: 17
Hi Guys,

I need to create an xml file which exports data out of nav. I use the following code:

WITH XMLDOMMgt DO BEGIN
IF NOT ISCLEAR(XMLDoc) THEN
CLEAR(XMLDoc);
CLEAR(XMLCurrentElement);
CREATE(XMLDoc);
ProcIns := XMLDoc.createProcessingInstruction('xml','version="1.0" encoding="UTF-8"');
XMLDoc.appendChild(ProcIns);
// CreateRootElement
CurrNode := XMLDoc.createElement('data');
CurrNode := XMLDoc.appendChild(CurrNode);
NameSpace := '';
AddAttribute(CurrNode,'xmlns','http://www.somesite.eu/nl');

AddAttribute(CurrNode,'xmlns:common','http://www.somesite.eu/schema/common');
AddAttribute(CurrNode, 'xmlns:xsi','http://www.w3c.org/2001/XMLSchema-instance');

When I run this, I get the following error:

The call to member createAttribute failed. msxml3.dll returned the following message:
The namespace prefix is not allowed to start with the reserved string "xml".

I need to add the namespace prefixes, otherwise my xmlfile will not be excepted. can someone help me with this?

Best regards,

Floris

Comments

  • ta5ta5 Member Posts: 1,164
    Hi Floris

    Have a look into Codeunit 6224, Function AddAttribute. A namespace is added by DOM function "setNamedItem".

    You call it then like
    xmlMgt.AddAttribute(CurrNode,'xmlns:commons','http://www.common.com/xmlns/common1/');

    Hope this helps

    Thomas
  • FlorisB1984FlorisB1984 Member Posts: 17
    Hi Thomas,

    Thanks for your reply!

    In my code I'm already using the XML dom management codeunit. I'm exactly in the same way adding the new namespace.

    best regards,

    Floris
  • ta5ta5 Member Posts: 1,164
    I have tested with MS XML 3.0 and MS XML 6.0. With 6.0 it works as expected, with 3.0 it doesnt.
    If you can, I would suggest you use 6.0, but be careful if its a part of a bigger application, 6.0 has quite some differences to 3.0, for example the standard values in properties, etc.

    Hope this helps.
    Thomas
  • FlorisB1984FlorisB1984 Member Posts: 17
    Hi Thomas,

    Thanks again!

    I've changed the automations to sml 6, but that did not solve my issue. It still complains about the xml version 3 dll. What am I doing wrong?

    Best regards,

    Floris
  • FlorisB1984FlorisB1984 Member Posts: 17
    Hi Thomas,

    I wasn't thinking straight, I know what you mean. And it works, thanks!

    What I needed to do, was create new function in my code unit and do the same thing als AddAttribute in codeunit 6224.

    best regards,

    Floris
  • ta5ta5 Member Posts: 1,164
    Hi Floris
    [Edit: Sorry, didnt note your answer.]
    Very strange. Please find my test codeunit in the following code section. It works, as long as the automation objects are in version 6.0
    OBJECT Codeunit 50901 xml test 2
    {
      OBJECT-PROPERTIES
      {
        Date=16.12.10;
        Time=15:39:16;
        Modified=Yes;
        Version List=;
      }
      PROPERTIES
      {
        OnRun=VAR
                XMLDoc@1103030003 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{88D96A05-F192-11D4-A65F-0040963251E5}:'Microsoft XML, v6.0'.DOMDocument60";
                ProcIns@1103030002 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF89-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMProcessingInstruction";
                CurrNode@1103030001 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF80-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMNode";
                NewChild@1103030000 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF80-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMNode";
                NameSpace@1103030004 : Text[30];
                XMLDOMMgt@1103030005 : Codeunit 6224;
              BEGIN
                CREATE(XMLDoc);
                ProcIns := XMLDoc.createProcessingInstruction('xml','version="1.0" encoding="UTF-8"');
                XMLDoc.appendChild(ProcIns);
                // CreateRootElement
                CurrNode := XMLDoc.createElement('data');
                CurrNode := XMLDoc.appendChild(CurrNode);
                NameSpace := '';
                XMLDOMMgt.AddAttribute(CurrNode,'xmlns','http://www.somesite.eu/nl');
    
                XMLDOMMgt.AddAttribute(CurrNode,'xmlns:common','http://www.somesite.eu/schema/common');
                XMLDOMMgt.AddAttribute(CurrNode, 'xmlns:xsi','http://www.w3c.org/2001/XMLSchema-instance');
    
                XMLDoc.save('c:\temp\1.xml');
              END;
    
      }
      CODE
      {
    
        BEGIN
        END.
      }
    }
    
  • FlorisB1984FlorisB1984 Member Posts: 17
    Hi Thomas,

    I'm running into the next issue. The company I have to send the xml to requeres the following nodes:

    <common:sender>

    After added the prefix xmlns:common I assumed it would work..... but it doesn't. Do you perhaps know how that is done? Or is the following xml code the same:

    <common:sender xmlns:common="common">

    best regards,

    Floris
  • ta5ta5 Member Posts: 1,164
    Hi Floris
    Imho the Element should look like that
    <common:sender> ==> Element Name with name space prefix
    or
    <sender xmlns:common="common"> ==> Element Name with name space as a kind of attribute.

    If you can choose, I suggest the first method.

    Thomas
  • FlorisB1984FlorisB1984 Member Posts: 17
    I can't choose :(

    So I'll have to go with the second option.

    Thans again!

    Floris
  • ta5ta5 Member Posts: 1,164
    Good luck!
    And by the way: There are normally 2 different ways for the target system to load the xml.

    1: Load it as text or read it by other sequential means like sax.
    2: Load it as XML DOM

    In case 2, there is no difference between different "dialects", the meaning stays the same. In case one, tags etc. must excactly match.

    Thomas
Sign In or Register to comment.