我如何使用php中的simplexml将值和节点作为字符串获取

时间:2014-11-16 08:30:23

标签: php xml

示例,我有一个像这样的xml代码:

$xml=<<<XML
<?xml version="1.0"?>
<cars>
  <desc1>
       <h1>Title 1</h1>
       <p>Content</p>
  </desc1>
  <desc2>
       <h1>Title 1</h1>
       <p>Content</p>
  </desc2> 
</cars>
XML;

如何使用simplexml在标记<desc1>...</desc1>之间获取字符串,因此输出如下:

$output='<h1>Title 1</h1>
           <p>Content</p>';

提前感谢:)

3 个答案:

答案 0 :(得分:1)

您可以使用DOMDocument然后将xml加载到其中。定位desc1然后获取其子节点,保存并将其放入容器字符串中。例如:

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

$output = '';
$desc1 = $dom->getElementsByTagName('desc1')->item(0)->childNodes;
foreach ($desc1 as $children) {
    $output .= $dom->saveHTML($children);
}

echo $output;

答案 1 :(得分:1)

作为@Ghost的替代方法,您可以使用Xpath直接获取子节点。

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

$output = '';
foreach ($xpath->evaluate('//desc1[1]/node()') as $child) {
    $output .= $dom->saveHTML($child);
}

echo $output;

Xpath表达式:

选择文档中任何位置的所有desc1个节点: //desc1

限制到第一个找到的节点: //desc1[1]

获取子节点(包括文本节点): //desc1[1]/node()

答案 2 :(得分:-1)

只是您特定简单示例的替代方案:

$output = "";
if(preg_match("/<desc1>[^<]*(<.*>)[^>]*<\/desc1>/s",$xml,$reg)) {
  $output = $reg[1];
}