在PHP中将XML转换为Object并再次将该对象转换为XML?

时间:2015-04-24 07:01:30

标签: php xml simplexml domdocument

假设我有一个XML,如下所示 -

$xml = '<?xml version="1.0"?>
<step number="9">
  <s_name>test</s_name>
  <b_sel>12345</b_sel>
  <b_ind>7</b_ind>
</step>';

我希望将它转换为对象,但是当我执行以下步骤时,它会给我stdclass对象,如下所示[我将它分配给$ stepInformation变量] -

$xml = json_decode(json_encode((array) simplexml_load_string($xml)), 1);

$stepInformation = stdClass Object
(
    [@attributes] => Array
        (
            [number] => 9
        )

    [s_name] => test
    [b_sel] => 12345
    [b_ind] => 7
)

所以当我在php函数中解析这个stdclass对象时

function convertStepInformationToArray($stepInformation)
{
     $dom = new DOMDocument();
    $stepInfo = "{$stepInformation->s_name}{$stepInformation->b_sel}{$stepInformation->b_ind}";    
$dom->loadXML("<document>" . $stepInfo . "</document>");
    $domx = new DOMXPath($dom);
    $entries = $domx->evaluate("//step");
    return $entries;
}

我得到的输出是

DOMNodeList Object
(
    [length] => 0
)

我希望[length] => 1继续我的项目。我知道问题出在<step number="9">之后,将其转换为对象后如下所示。

stdClass Object
    (
        [@attributes] => Array
            (
                [number] => 9
            )

注意 - 我甚至尝试过以下步骤,但没有运气:

$xml = simplexml_load_string($xml);

$stepInformation = SimpleXMLElement Object
        (
            [@attributes] => Array
            (
                [number] => 9
            )

        [s_name] => test
        [b_sel] => 12345
        [b_ind] => 7
)

请你们给我一些指示,如何得到如下输出?任何替代方法都可以,只要我得到确切的输出 -

   DOMNodeList Object
    (
        [length] => 1
    )

对此有任何帮助将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:4)

您实际上并不需要将SimpleXML对象加载到json_encode/decode

您可以使用该对象并解析所需的任何值。将encode/decode作为数组并且必须访问值然后将其转换为SimpleXML太多了。

$xml = '<?xml version="1.0"?>
<step number="9">
  <s_name>test</s_name>
  <b_sel>12345</b_sel>
  <b_ind>7</b_ind>
</step>';

$xml = simplexml_load_string($xml);

$step = $xml->xpath('//step');

echo $step[0]->attributes()->number; // 9

echo $xml->s_name, '<br/>', $xml->s_name, '<br/>', $xml->b_ind;

Sample Output

单独使用DOMDocument

$dom = new DOMDocument;
$dom->loadXML($xml);
$xpath = new DOMXpath($dom);

echo $xpath->evaluate('string(//step/@number)');

保持简单:

$xml = '<?xml version="1.0"?>
<step number="9">
    <s_name>test</s_name>
    <b_sel>12345</b_sel>
    <b_ind>7</b_ind>
</step>';

function convertStepInformationToArray($stepInformation) {
    $dom = new DOMDocument();
    $dom->loadXML($stepInformation);
    $domx = new DOMXPath($dom);
    $entries = $domx->evaluate("//step");
    return $entries;
}

print_r(convertStepInformationToArray($xml));