【问题标题】:Remove self-closing tags in XPath删除 XPath 中的自闭合标签
【发布时间】:2014-08-25 18:35:44
【问题描述】:

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

Remove empty tags from a XML with PHP

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

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

那么该部分的结果将是

<metro/>

有没有办法去掉那些自闭标签?

【问题讨论】:

  • 请求的输出是什么?如果整个节点为空,是否应该删除整个节点(所以如果距离和名称根本没有价值,您将一无所获)?
  • @matthias_h 正确。如果发生这种情况,我应该什么都得不到,而不是
  • 你用 php 处理 xml 还是 xpath 可以帮助你?
  • @matthias_h 我在 PHP 中使用 Xpath,就像我引用的问题一样。

标签: php xml xpath


【解决方案1】:

对您引用的 XPath 进行简单修改即可满足您的需要:

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

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

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

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

如果你不熟悉normalize-space(),我建议你阅读它,但基本上在这种情况下,如果元素内的所有文本节点都是空白,它会产生一个空字符串,所以对于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(),因此选择了metro

【讨论】:

  • @Alexey 在上面添加了解释。
【解决方案2】:

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

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

你只会得到包含非空子节点的 Metro-nodes。

【讨论】:

  • Metro 并不是唯一会出现这种情况的标签。它必须是一个更加全球化的解决方案。
  • 但是答案中的建议至少可以适用于地铁,并且必须调整“只是”以适用于更多标签..?在不知道 XML 的情况下很难猜测。
猜你喜欢
  • 1970-01-01
  • 2015-05-03
  • 2013-12-25
  • 2011-12-06
  • 2023-02-16
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多