Search code examples
phpxmlsimplexml

how can i generate this XML format with this element


This is what the output should be:

<invoice:company this="1">
    <invoice:transport from="7777777777" to="77777777777">
        <invoice:via via="7777777777" id="1"/>
    </invoice:transport>
</invoice:company>

But I am getting this:

<company this="1">
    <transport from="7777777777" to="77777777777">
        <via via="7777777777" id="1"/>
    </transport>
</company>

I am using this as XML generator:

$xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><invoice>
</invoice>');

//child of invoice
$company= $xml->addChild('company');

//child of company
$transport  = $processing->addChild('transport');
$transport->addAttribute('to','77777777777');
$transport->addAttribute('from','77777777777');

//child of transport
$via        = $transport->addChild('via');
$via->addAttribute('id','1');
$via->addAttribute('via','77777777777');

$xml->saveXML();
$xml->asXML("company_001.xml");'

Why is ":" on the element tag? how can I do that? I need to have that too.


Solution

  • As mentioned in the comment, invoice: is the namespace of the elements in the document.

    When creating an XML document with a namespace, you need to declare it. In the code below, in this I've done it in the initial document loaded into SimpleXMLElement. I don't know the correct definition of this namespace - so I've used "http://some.url" throughout (and all references need to be changed). If you don't define this namespace, SimpleXML will add it's own definition the first time you use it.

    When adding the elements in, you can define which namespace they get added to, the third parameter of addChild is the namespace.

    So...

    $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?>
    <invoice xmlns:invoice="http://some.url">
    </invoice>');
    
    //child of invoice
    $processing= $xml->addChild('company', "", "http://some.url");
    
    //child of company
    $transport  = $processing->addChild('transport', "", "http://some.url");
    $transport->addAttribute('to','77777777777');
    $transport->addAttribute('from','77777777777');
    
    //child of transport
    $via = $transport->addChild('via', "", "http://some.url");
    $via->addAttribute('id','1');
    $via->addAttribute('via','77777777777');
    
    echo $xml->asXML();
    

    Produces (I've formated the output to help)...

    <?xml version="1.0" encoding="utf-8"?>
    <invoice xmlns:invoice="http://some.url">
        <invoice:company>
            <invoice:transport to="77777777777" from="77777777777">
                <invoice:via id="1" via="77777777777" />
            </invoice:transport>
        </invoice:company>
    </invoice>
    

    As I'm not sure if this is the entire document your creating, there may need to be minor changes, but hope this helps.