ConFoo Montreal 2026: Call for Papers

Voting

: four plus three?
(Example: nine)

The Note You're Voting On

hezll at msn dot com
12 years ago
Most of the time we need to convert the XML to array or JSON , but now I have to completed the requirement of converting XML to XPath which make our template easily geting the data from XML data source due to the Xpath mapping .Here is the function:

<?php

function sxiToXpath($sxi, $key = null, &$tmp = null)
{
$keys_arr = array();
//get the keys count array
for ($sxi->rewind(); $sxi->valid(); $sxi->next())
{
$sk = $sxi->key();
if (
array_key_exists($sk, $keys_arr))
{
$keys_arr[$sk]+=1;
$keys_arr[$sk] = $keys_arr[$sk];
}
else
{
$keys_arr[$sk] = 1;
}
}
//create the xpath
for ($sxi->rewind(); $sxi->valid(); $sxi->next())
{
$sk = $sxi->key();
if (!isset($
$sk))
{
$
$sk = 1;
}
if (
$keys_arr[$sk] >= 1)
{
$spk = $sk . '[' . $$sk . ']';
$keys_arr[$sk] = $keys_arr[$sk] - 1;
$
$sk++;
}
else
{
$spk = $sk;
}
$kp = $key ? $key . '/' . $spk : '/' . $sxi->getName() . '/' . $spk;
if (
$sxi->hasChildren())
{
sxiToXpath($sxi->getChildren(), $kp, $tmp);
}
else
{
$tmp[$kp] = strval($sxi->current());
}
$at = $sxi->current()->attributes();
if (
$at)
{
$tmp_kp = $kp;
foreach (
$at as $k => $v)
{
$kp .= '/@' . $k;
$tmp[$kp] = $v;
$kp = $tmp_kp;
}
}
}
return
$tmp;
}

function
xmlToXpath($xml)
{
$sxi = new SimpleXmlIterator($xml);
return
sxiToXpath($sxi);
}

/**
* How to use the function
*/
$xml = <<<EOT
<?xml version="1.0" encoding="utf8" ?>
<data>
<item ID="30001">
<Company>Navarro Corp.</Company>
</item>
<item ID="30002" IDd="30002">
<Company>Performant Systems</Company>
</item>
<item ID="30003">
<Company id='id_test'><g id='id_g'>glove</g></Company>
</item>
<item>
</item>
</data>
EOT;

$rs = xmlToXpath($xml);
print_r($rs);

/**
* the results may lkie this:
Array
(
[/data/item[1]/Company[1]] => Navarro Corp.
[/data/item[1]/@ID] => SimpleXMLIterator Object
(
[0] => 30001
)
[/data/item[2]/Company[1]] => Performant Systems
[/data/item[2]/@ID] => SimpleXMLIterator Object
(
[0] => 30002
)

[/data/item[2]/@IDd] => SimpleXMLIterator Object
(
[0] => 30002
)

[/data/item[3]/Company[1]/g[1]] => glove
[/data/item[3]/Company[1]/g[1]/@id] => SimpleXMLIterator Object
(
[0] => id_g
)

[/data/item[3]/Company[1]/@id] => SimpleXMLIterator Object
(
[0] => id_test
)

[/data/item[3]/@ID] => SimpleXMLIterator Object
(
[0] => 30003
)

[/data/item[4]] =>

)
*/

echo "Total:" . count($rs);

echo
"<hr>";
/* You can check the xpath result like this */
$xml = new SimpleXMLElement($xml);
foreach (
$rs as $k => $v)
{
echo
"Xpath:" . $k . " |Value:" . $v . " ";
var_dump($xml->xpath($k));
echo
"<br>";
}

<< Back to user notes page

To Top