如何根据PHP中的信息删除XML节点?

如何根据PHP中的信息删除XML节点?,php,xml,dom,xml-parsing,simplexml,Php,Xml,Dom,Xml Parsing,Simplexml,前言:有许多类似的问题我已经仔细研究过了。没有什么能完全回答我需要做的事 这是我的数据结构。(明显简化) 123 001 1. 黄金 2. 银币 456 001 1. 我需要检查每张票中的第一项,如果标签为空,则删除整个。在这一点上,我愿意接受任何建议。您最好的选择是使用XPath和DomDocument。试试这个: <?php $xmlstr = <<<XML <?xml version='1.0'?> <Upload> <ti

前言:有许多类似的问题我已经仔细研究过了。没有什么能完全回答我需要做的事

这是我的数据结构。(明显简化)


123
001
1.
黄金
2.
银币
456
001
1.

我需要检查每张票中的第一项,如果
标签为空,则删除整个
。在这一点上,我愿意接受任何建议。

您最好的选择是使用XPath和DomDocument。试试这个:

<?php
$xmlstr = <<<XML
<?xml version='1.0'?>
<Upload>
    <tickets>
        <ticket>
            <ticket_number>123</ticket_number>
            <clerk>001</clerk>
            <property>
                <item>
                    <item_number>1</item_number>
                    <jewelry_metal>GOLD</jewelry_metal>
                </item>
                <item>
                    <item_number>2</item_number>
                    <jewelry_metal>SILVER</jewelry_metal>
                </item>
            </property>
        </ticket>
        <ticket>
            <ticket_number>456</ticket_number>
            <clerk>001</clerk>
            <property>
                <item>
                    <item_number>1</item_number>
                    <jewelry_metal></jewelry_metal>
                </item>
            </property>
        </ticket>
    </tickets>
</Upload>
XML;

$doc = new DOMDocument();
$doc->loadxml($xmlstr);

$xpath = new DOMXpath($doc);

foreach($xpath->query('//tickets/ticket/property/item[1]') as $key => $item) {
    if (empty($item->getElementsByTagName('jewelry_metal')->item(0)->nodeValue)) {
        $item->parentNode->removeChild($item);  
    }
}

echo $doc->saveXML();
getElementsByTagName('jewelry_metal')->item(0)->nodeValue)){
$item->parentNode->removeChild($item);
}
}
echo$doc->saveXML();
输出将是:

<?xml version="1.0"?>
<Upload>
    <tickets>
        <ticket>
            <ticket_number>123</ticket_number>
            <clerk>001</clerk>
            <property>
                <item>
                    <item_number>1</item_number>
                    <jewelry_metal>GOLD</jewelry_metal>
                </item>
                <item>
                    <item_number>2</item_number>
                    <jewelry_metal>SILVER</jewelry_metal>
                </item>
            </property>
        </ticket>
        <ticket>
            <ticket_number>456</ticket_number>
            <clerk>001</clerk>
            <property>

            </property>
        </ticket>
    </tickets>
</Upload>

123
001
1.
黄金
2.
银币
456
001

希望这有帮助

我建议您为此使用Xpath语言。让我们翻译一下:

我需要检查每张票中的第一项,如果
标签为空,则删除整个

转换为xpath:

//ticket[.//item[1]/jewelry_metal = ""]
将查询所有要删除的元素。要使用simplexml在PHP中运行这样一个xpath查询,然后删除元素,请参见以下问题:


确保已启用错误报告,因为您提供的XML已完全损坏。以防万一您没有注意到。

使用XML解析器解析数据。用你所选择的语言把它读成一个大的结构。操作结构中的数据。将修改后的数据写入一个新的XML文件。我很难接受DOM解析器是任何人的“最佳选择”…这是朝着正确方向迈出的一步,但我需要删除整个
,而不仅仅是
。这就是我挂断电话的地方,哈哈。
//ticket[.//item[1]/jewelry_metal = ""]