我试图使用php DOM类从xml文档中获取特定节点的值(文本),但我无法正确执行,因为我得到该节点的文本内容与其后代合并。
我们假设我需要从此文档中获取树:
<?xml version="1.0"?>
<trees>
LarchRedwoodChestnutBirch
<trimmed>Larch</trimmed>
<trimmed>Redwood</trimmed>
</trees>
我得到了:
LarchRedwoodChestnutBirchLarchRedwood
你可以看到我无法从整个文本中删除 trimmed 树所做的子串 LarchRedwood ,因为我只能得到 ChestnutBirch 和这不是我需要的。
有什么建议吗? (感谢名单)
答案 0 :(得分:3)
我明白了。这有效:
function specificNodeValue($node, $implode = true) {
$value = array();
if ($node->childNodes) {
for ($i = 0; $i < $node->childNodes->length; $i++) {
if (!(@$node->childNodes->item($i)->tagName)) {
$value[] = $node->childNodes->item($i)->nodeValue;
}
}
}
return (is_string($implode) ? implode($implode, $value) : ($implode === true ? implode($value) : $value));
}
给定节点就像一个根,如果在解析子节点时没有tagName,那么它本身就是,所以该子节点的值就是它自己的值。
在一个坏的形成的xml文档中,一个节点可以有许多值,将它们全部放入一个数组中以获得节点的整个值。
使用上面的函数获取所需的节点值,而不在其中合并子节点值。
参数是:
$ node(必需)必须是DOMElement对象
$ implode(可选)如果你想获得一个字符串(默认为true)或由多个值组成的数组(false)。 (如果您希望使用“胶水”字符串内爆数组,请设置字符串而不是布尔值。)
答案 1 :(得分:1)
您可以尝试将其删除trimmed
节点
$doc = new DOMDocument('1.0', 'utf-8');
$doc->loadXML($xml);
$xpath = new DOMXpath($doc);
$trees = $doc->getElementsByTagName('trees')->item(0);
foreach ($xpath->query('/trees/*') as $node)
{
$trees->removeChild($node);
}
echo $trees->textContent;
echo $trees->nodeValue;
答案 2 :(得分:0)
使用$node->nodeValue
获取节点的文本内容。如果使用$node->textContent
,则会从当前节点和所有子节点获取所有文本。
答案 3 :(得分:0)
理想情况下,XML应该是:
<?xml version="1.0"?>
<trees>
<tree>Larch</tree>
<tree>Redwood</tree>
<tree>Chestnut</tree>
<tree>Birch</tree>
</trees>
要将“LarchRedwoodChestnutBirch”拆分为单独的单词(以大写字母表示),您需要使用PHP的“PCRE”功能:
http://www.php.net/manual/en/book.pcre.php
'希望有所帮助!