PHP检索XML节点值用SimpleXML
问题描述:
我已经看到了SimpleXML和节点值有关的其他问题,但未能找到答案我的问题。
我有一个PHP变种包含形成这样一个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>
非常感谢
答
至于建议的@Tomalak,这是*: PHP SimpleXML get innerXML 重复你不能比使用simplexml API建议的更好。
function simplexml_innerXML($xml)
{
$content="";
foreach($node->children() as $child)
$content .= $child->asXml();
return $content;
}
在代码中,有$body_content = simplexml_innerXML($el);
但是更换$body_content = $el->asXml();
,你也可以切换到其他的API之间ofers区别innerXML
(你正在寻找)和outerXML
(你会得到什么现在)。微软Dom库提供了这种区别,但不幸的是PHP DOM不。
我发现PHP XMLReader API
提供了这种区别。请参阅readInnerXML()。虽然这个API有不同的处理XML的方法。尝试一下。
最后,我要强调的是,XML并不意味着将数据作为子树提取,而是作为值提取。这就是为什么你遇到麻烦找到正确的API。将HTML子树存储为值(并转义所有标记)而不是XML子树会更“标准”。另外请注意,某些HTML合成器并不总是与XML兼容(即<br> vs ,<br/>
)。无论如何,在实践中,你的方法对于编辑xml文件肯定更方便。
“节点值”是一个不明确的术语。您要求使用innerXML,而nodeValue通常会使用不带XML标签的内部文本。 – 2011-06-11 07:30:36
@Tomalak>其实,它是。对不起! – simo 2011-06-11 08:24:38
@lenzai>是的,但是,我不明白为什么simplexml作为没有方法来获得内部xml的XML值。 – simo 2011-06-11 09:06:28