【问题标题】:How can I remove certain elements from XML using SimpleXML如何使用 SimpleXML 从 XML 中删除某些元素
【发布时间】:2019-07-26 06:53:14
【问题描述】:

我像这样将以下 XML 数据加载到 SimpleXML 中:

<?php
$xmlString = <<<'XML'
<?xml version="1.0"?>
<response>
    <item key="0">
        <title>AH 2308</title>
        <field_a>3.00</field_a>
        <field_b>7.00</field_b>
        <field_d1>35.00</field_d1>
        <field_d2>40.00</field_d2>
        <field_e></field_e>
        <field_g2></field_g2>
        <field_g>M 45x1,5</field_g>
        <field_gewicht>0.13</field_gewicht>
        <field_gtin>4055953012781</field_gtin>
        <field_l>40.00</field_l>
        <field_t></field_t>
        <field_abdrueckmutter>KM 9</field_abdrueckmutter>
        <field_sicherung>MB 7</field_sicherung>
        <field_wellenmutter>KM 7</field_wellenmutter>
    </item>
    <item key="1">
        <title></title>
        <field_a></field_a>
        <field_b></field_b>
        <field_d1></field_d1>
        <field_d2></field_d2>
        <field_e></field_e>
        <field_g2></field_g2>
        <field_g></field_g>
        <field_gewicht></field_gewicht>
        <field_gtin></field_gtin>
        <field_l></field_l>
        <field_t></field_t>
        <field_abdrueckmutter></field_abdrueckmutter>
        <field_sicherung></field_sicherung>
        <field_wellenmutter></field_wellenmutter>
    </item>
</response>
XML;

$xml = simplexml_load_string($xml);

我怎样才能达到以下结果:

<?xml version="1.0"?>
<response>
    <item key="0">
        <title>AH 2308</title>
        <field_a>3.00</field_a>
        <field_b>7.00</field_b>
        <field_d1>35.00</field_d1>
        <field_d2>40.00</field_d2>
        <field_e></field_e>
        <field_g2></field_g2>
        <field_g>M 45x1,5</field_g>
        <field_gewicht>0.13</field_gewicht>
        <field_gtin>4055953012781</field_gtin>
        <field_l>40.00</field_l>
        <field_t></field_t>
        <field_abdrueckmutter>KM 9</field_abdrueckmutter>
        <field_sicherung>MB 7</field_sicherung>
        <field_wellenmutter>KM 7</field_wellenmutter>
    </item>
    <item key="1"></item>
</response>

要删除所有空元素,我可以使用以下工作代码:

foreach ($xml->xpath('/child::*//*[not(*) and not(text()[normalize-space()])]') as $emptyElement) {
    unset($emptyElement[0]);
}

但这并不是我想要的。

基本上,当&lt;title&gt; 元素为空时,我想将其及其所有兄弟元素一起删除,并保留父&lt;item&gt; 元素。

重要的是:如果&lt;title&gt; 不为空,我也想保留空元素。例如,请参阅&lt;item key="0"&gt;&lt;field_e&gt;&lt;field_g2&gt;&lt;field_t&gt; 元素将保持不变。

是否有一个简单的 xpath 查询可以实现这一目标?希望任何人都可以提供帮助。提前致谢!

【问题讨论】:

标签: php xml simplexml


【解决方案1】:

此 xpath 查询正在运行:

foreach ($xml->xpath('//title[not(text()[normalize-space()])]/following-sibling::*') as $emptyElement) {
    unset($emptyElement[0]);
}

它保留了&lt;title&gt; 元素,但我可以忍受。

【讨论】:

    【解决方案2】:

    DOM 操作节点更灵活:

    $document = new DOMDocument();
    $document->loadXML($xmlString);
    $xpath = new DOMXpath($document);
    
    $expression = '/response/item[not(title[normalize-space()])]';
    
    foreach ($xpath->evaluate($expression) as $emptyItem) {
        // replace children with an empty text node
        $emptyItem->textContent = '';
    }
    
    echo $document->saveXML();
    

    【讨论】:

      猜你喜欢
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      相关资源
      最近更新 更多