【问题标题】:Convert XML to Object in PHP and again convert that Object to XML? [duplicate]在 PHP 中将 XML 转换为 Object 并再次将该 Object 转换为 XML? [复制]
【发布时间】:2015-04-24 15:52:30
【问题描述】:

假设我有一个如下的 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] =&gt; 1 继续我的项目。我知道问题出在&lt;step number="9"&gt;,在将其转换为对象后如下所示。

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
    )

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

谢谢。

【问题讨论】:

  • 当您已经可以解析来自SimpleXML 对象的值时,您是否有任何特殊原因需要使用json_encode/decode
  • 刚刚更新了我的问题。我什至用过 SIMpleXML,但没有运气。
  • $stepInformation 中的记录不提供 stdClass 对象输出。您已在 (array) simplexml_load_string($xml) 中写入数组,并且您正在像对象一样获取 $stepInformation-&gt;s_name
  • 要将 SimpleXML 对象转换为 DOM 对象,只需使用 dom_import_simplexml - 它甚至不必重新处理 XML,因为它们在内部都使用相同的表示。 (还有一个simplexml_import_dom 也可以返回。)
  • @hakre 它们完全是不同的问题。 stackoverflow.com/q/29818820/367456 用于从 XML 内容中获取 OCI-Lob 对象。这个问题是用于将 XML 转换为 stdclass/SimpleXML 对象。

标签: php xml simplexml domdocument


【解决方案1】:

您实际上不需要将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));

【讨论】:

  • 我需要在函数 convertStepInformationToArray($stepInformation) 中传递对象,其中 $stepInformation 保存 XML 对象。
  • @CloudFreezer 如果您确实需要返回DOMNodelist,则将xml字符串直接加载到DOMDocument
  • 伙计,非常感谢你。你只是摇滚。你为我节省了很多时间:)
  • @CloudFreezer 很高兴这有帮助
  • @Ghost:OP 是一个自我复制者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
相关资源
最近更新 更多