PHP XML to Array/Object with Attributes and Values - php

AI have an XML which have attributes as well as values in them. I want to convert it to an Array or Array Object along with attributes and values.
XML
<?xml version="1.0" encoding="UTF-8"?>
<itemBody>
<div label="options">
<optionchoices optionIdentifier="RESPONSE" shuffle="false" maxOptions="1">
<choice identifier="A1"><![CDATA[aaaa]]></choice>
<choice identifier="A2"><![CDATA[bbbb]]></choice>
<choice identifier="A3"><![CDATA[cccc]]></choice>
</optionchoices>
</div>
</itemBody>
I tried two set of code but the result was not as expected.
Code 1
<?php
$xml = simplexml_load_file('test.xml', 'SimpleXMLElement', LIBXML_NOCDATA);
echo "<pre>";print_r($xml);echo "</pre>"; exit;
?>
Output
SimpleXMLElement Object
(
[div] => SimpleXMLElement Object
(
[#attributes] => Array
(
[label] => options
)
[optionchoices] => SimpleXMLElement Object
(
[#attributes] => Array
(
[optionIdentifier] => RESPONSE
[shuffle] => false
[maxOptions] => 1
)
[choice] => Array
(
[0] => aaaa
[1] => bbbb
[2] => cccc
)
)
)
)
In the above output if we check then in choice node we get the values only and not the attributes
Code 2
<?php
$xml = simplexml_load_file('test.xml');
echo "<pre>";print_r($xml);echo "</pre>"; exit;
?>
Output
SimpleXMLElement Object
(
[div] => SimpleXMLElement Object
(
[#attributes] => Array
(
[label] => options
)
[optionchoices] => SimpleXMLElement Object
(
[#attributes] => Array
(
[optionIdentifier] => RESPONSE
[shuffle] => false
[maxOptions] => 1
)
[choice] => Array
(
[0] => SimpleXMLElement Object
(
[#attributes] => Array
(
[identifier] => A1
)
)
[1] => SimpleXMLElement Object
(
[#attributes] => Array
(
[identifier] => A2
)
)
[2] => SimpleXMLElement Object
(
[#attributes] => Array
(
[identifier] => A3
)
)
)
)
)
)
In this output we get only attributes of XML.
Now what I want is to obtain Attributes as well as Values of the XML.
Please help.
Thanks in advance.

This is what I got. And this is the solution which I expected.
http://outlandish.com/blog/xml-to-json/

Related

Get values from an XML object in PHP

I got the following object in PHP:
Array
(
[0] => SimpleXMLElement Object
(
[#attributes] => Array
(
[native] => France
)
[0] => France
)
[1] => SimpleXMLElement Object
(
[#attributes] => Array
(
[native] => Nederland
)
[0] => Netherlands
)
[2] => SimpleXMLElement Object
(
[#attributes] => Array
(
[native] => Deutschland
)
[0] => Germany
)
)
How do I get only the values sitting right after [0]?
For the given example I would like to have: France Netherlands Germany
To get string value of SimpleXMLElement Object cast object to string explicitly:
$xmlObject = ...; // your object here
$str = (string) $xmlObject;
echo $str;
// also if you just
echo $xmlObject;
// $xmlObject will be casted to string implicitly

How to get the value from XML file in PHP?

This is my xml code
<Hotelobjekt xmlns="http://www.dcs-caesar.de/hoteldaten" CRSSperre="false" Buchungssperre="false">
<Hotelcode>AYTBLK0038</Hotelcode>
<Hotelname>LIMAK ATLANTIS DE LUXE HOTEL &amp; RESORT</Hotelname>
<Saisondefinition Saisonkuerzel="W16" DatumVon="2016-11-01" DatumBis="2017-04-06">
<Saisonzeit Nummer="1">
<Zeitraum DatumVon="2016-11-01" DatumBis="2016-11-18"/>
<Zeitraum DatumVon="2016-12-25" DatumBis="2016-12-31"/>
</Saisonzeit>
<Saisonzeit Nummer="2">
<Zeitraum DatumVon="2017-01-01" DatumBis="2017-03-06"/>
<Zeitraum DatumVon="2016-11-19" DatumBis="2016-12-24"/>
</Saisonzeit>
<Saisonzeit Nummer="3">
<Zeitraum DatumVon="2017-03-07" DatumBis="2017-04-06"/>
</Saisonzeit>
</Saisondefinition>
</Hotelobjekt>
$items = simplexml_load_file($url);
print_r($items); // it's okey works
array output;
SimpleXMLElement Object ( [#attributes] => Array ( [CRSSperre] =>
false [Buchungssperre] => false ) [Hotelcode] => AYTBLK0038
[Hotelname] => LIMAK ATLANTIS DE LUXE HOTEL & RESORT
[Saisondefinition] => SimpleXMLElement Object ( [#attributes] => Array
( [Saisonkuerzel] => W16 [DatumVon] => 2016-11-01 [DatumBis] =>
2017-04-06 ) [Saisonzeit] => Array ( [0] => SimpleXMLElement Object (
[#attributes] => Array ( [Nummer] => 1 ) [Zeitraum] => Array ( [0] =>
SimpleXMLElement Object ( [#attributes] => Array ( [DatumVon] =>
2016-11-01 [DatumBis] => 2016-11-18 ) ) [1] => SimpleXMLElement Object
( [#attributes] => Array ( [DatumVon] => 2016-12-25 [DatumBis] =>
2016-12-31 ) ) ) ) [1] => SimpleXMLElement Object ( [#attributes] =>
Array ( [Nummer] => 2 ) [Zeitraum] => Array ( [0] => SimpleXMLElement
Object ( [#attributes] => Array ( [DatumVon] => 2017-01-01 [DatumBis]
=> 2017-03-06 ) ) [1] => SimpleXMLElement Object ( [#attributes] => Array ( [DatumVon] => 2016-11-19 [DatumBis] => 2016-12-24 ) ) ) ) [2]
=> SimpleXMLElement Object ( [#attributes] => Array ( [Nummer] => 3 ) [Zeitraum] => SimpleXMLElement Object ( [#attributes] => Array (
[DatumVon] => 2017-03-07 [DatumBis] => 2017-04-06 ) ) ) ) ) )
echo $items->Hotelcode."<br>";
echo $items->Hotelname."<br>";
this code works but I want to get the other code
<Zeitraum DatumVon="2017-01-01" DatumBis="2017-03-06"/>
Just do loop with child items
$xml = simplexml_load_string($string);
foreach($xml->Saisondefinition->Saisonzeit as $Saisonzeit) {
echo $Saisonzeit['Nummer'] . "<br>\n";
foreach($Saisonzeit->Zeitraum as $Zeitraum ) {
echo $Zeitraum['DatumVon'] . ' - ' . $Zeitraum['DatumBis'] . "<br>\n";
}
}
Demo on eval.in

How to check array object and array?

First array:
[VariationSpecificsSet] => SimpleXMLElement Object
(
[NameValueList] => Array
(
[0] => SimpleXMLElement Object
(
[Name] => Size
[Value] => Array
(
[0] => 5FT King Size
[1] => 4FT6 Double
)
)
[1] => SimpleXMLElement Object
(
[Name] => Main Colour
[Value] => Array
(
[0] => Brown
[1] => Black
)
)
)
)
Second Array:
[Variation] => SimpleXMLElement Object
(
[StartPrice] => 14.99
[Quantity] => 12
[VariationSpecifics] => SimpleXMLElement Object
(
[NameValueList] => SimpleXMLElement Object
(
[Name] => Size
[Value] => No.10-1M
)
)
)
examine above two arrays
i want to store value NameValueList in database but the problem is sometimes it is SimpleXMLElement Object and sometimes it is Array
how can i store them ...??
You can detect is by is_array().
$myVal=$test['NameValueList'];
if(is_array($myVal) && count($myVal)>0){
foreach($myVal as $item){
echo $item->Name.":".echo $item->Value;
}
} else {
echo $myVal->Name.":".echo $myVal->Value;
}
Did you tried using json_encode like below.
You can convert the object to array.
$array=json_decode(json_encode($object),true);

Parsing PHP SimpleXMLElement

I am using php to consume a web service (in coldfusion) to validate against the active directory. My code is below.
<?php
$racf = $_SERVER['AUTH_USER'];
//echo $racf;
//echo $myracf = trim($racf, "FEDERATED\.");
//get authenticated user
$arrUser = explode("\\", $_SERVER["LOGON_USER"]);
$racf = $arrUser[1];
echo $racf.'<br ><br >';
$logins = "http://acoldfusionwebservice/login.cfc?method=loginad&racf=$racf";
if( ! $xml = simplexml_load_file($logins) )
{
echo 'unable to load XML file';
}
else
{
//echo 'XML file loaded successfully <br />';
print_r ($xml);
}
?>
And this produces the following.
SimpleXMLElement Object
(
[#attributes] => Array
(
[version] => 1.0
)
[header] => SimpleXMLElement Object
(
)
[data] => SimpleXMLElement Object
(
[recordset] => SimpleXMLElement Object
(
[#attributes] => Array
(
[rowCount] => 1
[fieldNames] => cn,mail,givenName,sn
)
[field] => Array
(
[0] => SimpleXMLElement Object
(
[#attributes] => Array
(
[name] => cn
)
[string] => B000000
)
[1] => SimpleXMLElement Object
(
[#attributes] => Array
(
[name] => mail
)
[string] => john.doe#company.com
)
[2] => SimpleXMLElement Object
(
[#attributes] => Array
(
[name] => givenName
)
[string] => John
)
[3] => SimpleXMLElement Object
(
[#attributes] => Array
(
[name] => sn
)
[string] => Doe
)
)
)
)
)
Can someone help me to parse this information so that I can assign variables and use them. Thanks.
Try
$xml->data->recordset->field[0]->string
I think that field[0] is an Object again

Select elements other then a specific one form Xml Object

I am parsing the array given below. Looping through td using foreach. Now i want to select the value other than [#attributes]. I cannot use a or p specifically as they change through out the objects.
How can i achieve this?
[0] => SimpleXMLElement Object
(
[th] => SimpleXMLElement Object
(
[#attributes] => Array
(
[rowspan] => 2
[scope] => row
)
[p] => Memory
)
[td] => Array
(
[0] => SimpleXMLElement Object
(
[#attributes] => Array
(
[class] => ttl
)
[a] => Card slot
)
[1] => SimpleXMLElement Object
(
[#attributes] => Array
(
[class] => nfo
)
[p] => No
)
)
)
Want the solution to work in php.
Try below one
<?php
foreach($td as $element)
{
foreach($element as $key => $value)
{
if(!preg_match("/#/", $key) && !is_array($value))
echo $element[$key];
}
}
?>

Categories