PHP使用simplexml检索xml节点值

时间:2011-06-11 07:18:07

标签: php simplexml

  

可能重复:
  PHP SimpleXML get innerXML

我见过其他与simplexml和node value有关的问题,但找不到问题的答案。

我有一个PHP var,其中包含一个像这样形成的xml文档:

<div id="container">
<div id="header"></div>
<div id="main">
      ##CONTENTS## cd <strong>dscsdcsd</strong> sdcsc
  <div>my content here</div>
  <span>and there</span>
    </div>
<div id="footer"> </div>
</div>

我想检索 节点。但是使用以下代码,我还检索标记:

$xml = simplexml_load_string($_POST['newsletter_body']);
$att = 'id';

  foreach ($xml->children() as $el) {
    if($el->attributes()->$att == 'main') {
      $body_content = $el->asXml();
    }
  }

有人能告诉我如何只获得节点值(不使用xpath)?

要清楚,现在我明白了:

<div id="main">
      ##CONTENTS## cd <strong>dscsdcsd</strong> sdcsc
      <div>my content here</div>
      <span>and there</span>
</div>

我只想要:

      ##CONTENTS## cd <strong>dscsdcsd</strong> sdcsc
      <div>my content here</div>
      <span>and there</span>

非常感谢

1 个答案:

答案 0 :(得分:1)

根据@Tomalak的建议,这是Stackoverflow: PHP SimpleXML get innerXML的副本 并且你不能做得比使用simplexml API更好。

function simplexml_innerXML($xml)
{
    $content="";
    foreach($node->children() as $child)
        $content .= $child->asXml();
    return $content;
}

在您的代码中,将$body_content = $el->asXml();替换为$body_content = simplexml_innerXML($el);


但是,您也可以切换到另一个用于区分innerXML(您要查找的内容)和outerXML(您现在获得的内容)的API。 Microsoft Dom libary提供了这种区别,但遗憾的是PHP DOM没有。

我发现PHP XMLReader API提供了这种区别。见readInnerXML()。虽然这个API在处理XML方面有很多不同的方法。试试吧。


最后,我要强调的是,XML并不是要将数据提取为子树,而是将其作为值。这就是为什么你在找到合适的API时遇到麻烦的原因。将HTML子树存储为值(并转义所有标记)而不是XML子树将更“标准”。还要注意一些HTML synthax并不总是与XML兼容(即<br> vs ,<br/>)。无论如何,在实践中,你的方法对于编辑xml文件肯定更方便。