dairinjan
dairinjan

Reputation: 83

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.

Upvotes: 1

Views: 126

Answers (1)

Nigel Ren
Nigel Ren

Reputation: 57131

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.

Upvotes: 1

Related Questions