simplexml php获取xml

simplexml php获取xml,php,xml,simplexml,Php,Xml,Simplexml,如果我有这样的文件: <!-- in doc.xml --> <a> <b> greetings? <c>hello</c> <d>goodbye</c> </b> </a> 问候语? 你好 再见 是否有任何方法可以使用simplexml(或任何php内置)来获取包含以下内容的字符串: greetings? <c>hello</c&g

如果我有这样的文件:

<!-- in doc.xml -->
<a>
  <b>
    greetings?
    <c>hello</c>
    <d>goodbye</c>
  </b>
</a>

问候语?
你好
再见
是否有任何方法可以使用simplexml(或任何php内置)来获取包含以下内容的字符串:

greetings?
<c>hello</c>
<d>goodbye</d>
问候语?
你好
再见
空格之类的东西不重要


谢谢

我必须承认这并不像人们想象的那么简单。这就是我想到的:

$xml = new DOMDocument;
$xml->load('doc.xml');

// find just the <b> node(s)
$xpath = new DOMXPath($xml);
$results = $xpath->query('/a/b');

// get entire <b> node as text
$node = $results->item(0);
$text = $xml->saveXML($node);

// remove encapsulating <b></b> tags
$text = preg_replace('#^<b>#', '', $text);
$text = preg_replace('#</b>$#', '', $text);

echo $text;
$xml=新文档;
$xml->load('doc.xml');
//仅查找节点
$xpath=newdomxpath($xml);
$results=$xpath->query('/a/b');
//将整个节点作为文本获取
$node=$results->item(0);
$text=$xml->saveXML($node);
//移除封装标签
$text=preg_replace(“#^#,”,“$text);
$text=preg_replace(“#$#,”$text);
echo$文本;
关于XPath查询 查询返回所有匹配的节点,因此如果有多个匹配的
标记,您可以循环通过
$results
获取所有匹配的节点

我对
'/a/b'
的查询假设
。一些调整可能包括:

  • 'a/b'
    ––
    的子项,但
    是任何地方,而不仅仅是根目录
  • 'a//b'
    ––
    的后代,不管它有多深,而不仅仅是一个直系子代
  • '//b'
    –文档中任何位置的所有
    节点
关于获取字符串内容的方法 我尝试使用
$node->nodeValue
$node->textContent
,但它们都去掉了
标记,只保留了这些标记的文本内容。我还尝试将其转换为DOMText对象,但这并没有直接起作用,而且麻烦比它的价值还多

关于正则表达式的使用
没有正则表达式也可以完成,但我发现使用它们最简单。我想确保我只在字符串的开头和结尾剥离了
,以防内容中有其他
节点。

这样如何?因为您已经知道XML格式:

<?php
$xml = simplexml_load_file('doc.xml'); 
$str = $xml->b;
$str .= "<c>".$xml->b->c."</c>";
$str .= "<d>".$xml->b->d."</d>";

echo $str;
?>
b;
$str.=''.$xml->b->c.'';
$str.=''.$xml->b->d.'';
echo$str;
?>

这里有一种替代方法,使用DOM(平衡SimpleXML答案!)输出第一个
元素的所有内容

$doc = new DOMDocument;
$doc->load('doc.xml');
$bee = $doc->getElementsByTagName('b')->item(0);

$innerxml = '';
foreach ($bee->childNodes as $node) {
    $innerxml .= $doc->saveXML($node);
}
echo $innerxml;

我希望你的意思是说再见,而不是说再见。只要格式保证总是一样的,那就稍微短一点。谢谢。这是一个很好的回答。