首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用PHP从XML中删除空标记

使用PHP从XML中删除空标记
EN

Stack Overflow用户
提问于 2011-12-22 19:28:31
回答 5查看 14.1K关注 0票数 10

问题

如何在PHP中删除空的xml标记?

示例:

代码语言:javascript
运行
复制
 $value1 = "2";
 $value2 = "4";
 $value3 = "";

 xml = '<parentnode>
        <tag1> ' .$value1. '</tag1>
        <tag2> ' .$value2. '</tag2>
        <tag3> ' .$value3. '</tag3>
       </parentnode>';

XML结果:

代码语言:javascript
运行
复制
<parentnode>
    <tag1>2</tag1>
    <tag2>4</tag2>
    <tag3></tag3> // <- Empty tag
</parentnode>

我想要的!

代码语言:javascript
运行
复制
    <parentnode>
            <tag1>2</tag1>
            <tag2>4</tag2> 
    </parentnode>

不带"tag3“等空标记的XML

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-22 19:38:47

可以结合使用XPathpredicate not(node())来选择没有子节点的所有元素。

代码语言:javascript
运行
复制
<?php
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->loadxml('<parentnode>
    <tag1>2</tag1>
    <tag2>4</tag2>
    <tag3></tag3>
    <tag2>4</tag2>
    <tag3></tag3>
    <tag2>4</tag2>
    <tag3></tag3>
</parentnode>');

$xpath = new DOMXPath($doc);

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

$doc->formatOutput = true;
echo $doc->savexml();

打印

代码语言:javascript
运行
复制
<?xml version="1.0"?>
<parentnode>
  <tag1>2</tag1>
  <tag2>4</tag2>
  <tag2>4</tag2>
  <tag2>4</tag2>
</parentnode>
票数 17
EN

Stack Overflow用户

发布于 2014-02-01 07:38:21

这将以递归方式工作,并删除符合以下条件的节点:

  • contain spaces
  • not have attributes
  • not have子笔记

代码语言:javascript
运行
复制
// not(*) does not have children elements
// not(@*) does not have attributes
// text()[normalize-space()] nodes that include whitespace text
while (($node_list = $xpath->query('//*[not(*) and not(@*) and not(text()[normalize-space()])]')) && $node_list->length) {
    foreach ($node_list as $node) {
        $node->parentNode->removeChild($node);
    }
}
票数 7
EN

Stack Overflow用户

发布于 2011-12-22 19:32:35

代码语言:javascript
运行
复制
$dom = new DOMDocument;

$dom->loadXML($xml);

$elements = $dom->getElementsByTagName('*');

foreach($elements as $element) {

   if ( ! $element->hasChildNodes() OR $element->nodeValue == '') {
       $element->parentNode->removeChild($element);
   }

} 

echo $dom->saveXML();

CodePad

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8603237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档