2011-06-11 85 views
1

可能重复:
PHP SimpleXML get innerXMLPHP检索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> 

非常感谢

+1

“节点值”是一个不明确的术语。您要求使用innerXML,而nodeValue通常会使用不带XML标签的内部文本。 – 2011-06-11 07:30:36

+0

@Tomalak>其实,它是。对不起! – simo 2011-06-11 08:24:38

+0

@lenzai>是的,但是,我不明白为什么simplexml作为没有方法来获得内部xml的XML值。 – simo 2011-06-11 09:06:28

回答

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 = 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文件肯定更方便。

+0

谢谢,我会试一试,但我可能会在其他线程中使用SimpleDOM外部库。 readInnerXML()使用PHP 5.2,因为simplexml只使用PHP 5。我需要的应用程序是通用的 – simo 2011-06-11 12:44:11

+0

我建议他们的第二个选择与自定义迭代。看到我上面的更新。 – 2011-06-11 12:47:07

+0

确实很有意思! – simo 2011-06-12 17:39:05