删除XPath中的自关闭标记

时间:2014-08-25 18:35:44

标签: php xml xpath

我使用此解决方案从生成的XML中删除空标记。

Remove empty tags from a XML with PHP

但是,如果生成的XML具有空的嵌套节点,例如:

<metro>
   <distance></distance>
   <name></name>
</metro>

然后该部分的结果将是

<metro/>

有没有办法删除那些自动关闭标签?

2 个答案:

答案 0 :(得分:1)

不知道您是否可以在设置中使用它,但使用XPath-Expression

/*/metro/*[normalize-space()]/parent::*

你只会得到带有非空的孩子的城域节点。

答案 1 :(得分:1)

对您引用的XPath的简单修改应该可以满足您的需求:

//*[not(normalize-space())]

foreach( $xpath->query('//*[not(normalize-space())]') as $node ) {
    $node->parentNode->removeChild($node);
}

您链接的问题中的答案可以解释为“匹配所有没有子节点的元素”。 metro有五个子节点,因此XPath与它不匹配。

我的回答中的XPath可以解释为“匹配所有不包含任何非空白文本的元素”。

如果你不熟悉它,我建议你阅读normalize-space(),但基本上在这种情况下,如果一个元素中的所有文本节点都是空格,它会产生一个空字符串,所以在{{{3}}的情况下1}}我们有:

metro

由于谓词评估为not(normalize-space()) not(normalize-space(.)) // If no argument is specified, the context node is used. not(normalize-space(" // normalize-space() expects a string, so the nodeset . is // replaced with its string-value (all the text it contains). ")) not("") // normalize-space() eliminates all leading and trailing // whitespace. not(false()) // not() expects a boolean, and the boolean equivalent of // the empty string is false() true() ,因此选择了true()