前言:有许多类似的问题,我已经大量搜索过了。没有什么可以完全回答我需要做的事情。
这是我的数据结构。 (显然简化)
<Upload>
<tickets>
<ticket>
<ticket_number>123</ticket_number>
<clerk>001</clerk>
<property>
<item>
<item_number>1</item>
<jewelry_metal>GOLD</jewelry_metal>
</item>
<item>
<item_number>2</item>
<jewelry_metal>SILVER</jewelry_metal>
</item>
</property>
</ticket>
<ticket>
<ticket_number>456</ticket_number>
<clerk>001</clerk>
<property>
<item>
<item_number>1</item>
<jewelry_metal></jewelry_metal>
</item>
</property>
</ticket>
<tickets>
<Upload>
我需要检查每张故障单中的第一项,如果<jewelry_metal>
标记为空,请删除整个<ticket>
。我现在对任何建议持开放态度。
答案 0 :(得分: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();
输出将是:
<?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>
希望这有帮助!
答案 1 :(得分:0)
我建议您使用Xpath语言。让我们翻译:
我需要检查每个故障单中的第一项,如果
<jewelry_metal>
标记为空,请删除整个<ticket>
进入xpath:
//ticket[.//item[1]/jewelry_metal = ""]
这将查询要删除的所有元素。要在PHP中使用simplexml运行这样的xpath查询,然后删除元素,请参阅此问题:
确保您已启用错误报告,因为您提供的XML已完全损坏。万一你没注意到。