Php 在foreach循环中取消设置特定节点
我完全被困在这里了 我在PHP中有一个简单的xml结构Php 在foreach循环中取消设置特定节点,php,simplexml,Php,Simplexml,我完全被困在这里了 我在PHP中有一个简单的xml结构 <InvoiceLines> <InvoiceLine> <SalesInvoiceProductLine> <ProductIdentifier type="customer">4867895346</ProductIdentifier> <ProductName>a name</ProductName
<InvoiceLines>
<InvoiceLine>
<SalesInvoiceProductLine>
<ProductIdentifier type="customer">4867895346</ProductIdentifier>
<ProductName>a name</ProductName>
<ProductUnitPrice type="net">75</ProductUnitPrice>
<ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
<SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
<Dimension>
<DimensionName>Kustannuspaikka</DimensionName>
<DimensionItem>110 Tukkukauppa kotimaa</DimensionItem>
</Dimension>
</SalesInvoiceProductLine>
</InvoiceLine>
<InvoiceLine>
<SalesInvoiceProductLine>
<ProductIdentifier type="customer">1345573456</ProductIdentifier>
<ProductName>name</ProductName>
<ProductUnitPrice type="net">31</ProductUnitPrice>
<ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
<SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
<Dimension>
<DimensionName>Kustannuspaikka</DimensionName>
<DimensionItem>150</DimensionItem>
</Dimension>
</SalesInvoiceProductLine>
</InvoiceLine>
<InvoiceLine>
<SalesInvoiceProductLine>
<ProductIdentifier type="customer">Shipping_cost</ProductIdentifier>
<ProductName>Shipping</ProductName>
<ProductUnitPrice type="net">0</ProductUnitPrice>
<ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
<SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
<SalesInvoiceProductLineDiscountPercentage>0</SalesInvoiceProductLineDiscountPercentage>
</SalesInvoiceProductLine>
</InvoiceLine>
我无法理解这件事。它找到了运输成本,但无法使未设置的工作。$key变量只包含一个字符串(11)“InvoiceLine”。我尝试了更多的方法,但到目前为止,没有一种方法能够找到正确的元素
如果需要任何信息,请告诉我 因为您要处理xml,所以最好使用xpath。大致如下:
dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
$targets = $xpath->query('//ProductIdentifier[text()="Shipping_cost"]');
foreach ($targets as $target) {
$target->parentNode->removeChild($target);
}
echo $dom->saveXML();
这将获得正确的输出。您可以保存发票行的索引,并将其从末尾的base->InvoiceLine数组中删除。我对你的代码做了一些修改,以便在我的系统中运行
<!DOCTYPE html>
<html>
<body>
<?php
$myXMLData =
'<InvoiceLines>
<InvoiceLine>
<SalesInvoiceProductLine>
<ProductIdentifier type="customer">4867895346</ProductIdentifier>
<ProductName>a name</ProductName>
<ProductUnitPrice type="net">75</ProductUnitPrice>
<ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
<SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
<Dimension>
<DimensionName>Kustannuspaikka</DimensionName>
<DimensionItem>110 Tukkukauppa kotimaa</DimensionItem>
</Dimension>
</SalesInvoiceProductLine>
</InvoiceLine>
<InvoiceLine>
<SalesInvoiceProductLine>
<ProductIdentifier type="customer">1345573456</ProductIdentifier>
<ProductName>name</ProductName>
<ProductUnitPrice type="net">31</ProductUnitPrice>
<ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
<SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
<Dimension>
<DimensionName>Kustannuspaikka</DimensionName>
<DimensionItem>150</DimensionItem>
</Dimension>
</SalesInvoiceProductLine>
</InvoiceLine>
<InvoiceLine>
<SalesInvoiceProductLine>
<ProductIdentifier type="customer">Shipping_cost</ProductIdentifier>
<ProductName>Shipping</ProductName>
<ProductUnitPrice type="net">0</ProductUnitPrice>
<ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
<SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
<SalesInvoiceProductLineDiscountPercentage>0</SalesInvoiceProductLineDiscountPercentage>
</SalesInvoiceProductLine>
</InvoiceLine>
<InvoiceLine>
<SalesInvoiceProductLine>
<ProductIdentifier type="customer">222222222</ProductIdentifier>
<ProductName>name</ProductName>
<ProductUnitPrice type="net">31</ProductUnitPrice>
<ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
<SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
<Dimension>
<DimensionName>Kustannuspaikka</DimensionName>
<DimensionItem>150</DimensionItem>
</Dimension>
</SalesInvoiceProductLine>
</InvoiceLine>
</InvoiceLines>';
$base=simplexml_load_string($myXMLData);
print_r($base);
echo "<br>------------------------<br>";
$indexes = array();
$i = 0;
//remove shipping lines, always 0 and not needed
foreach ($base->InvoiceLine as $key) {
echo "***".$key->SalesInvoiceProductLine->ProductIdentifier."==="."<br>";
if ($key->SalesInvoiceProductLine->ProductIdentifier == "Shipping_cost") {
echo "shipping cost FOUND \n";
echo "\n";
var_dump($key);
echo "\n";
array_push($indexes, $i);
}
$i++;
}
foreach($indexes as $index) {
unset($base->InvoiceLine[$index]);
}
echo "<br>------------------------<br>";
print_r($base);
echo "<br>------------------------<br>";
foreach ($base->InvoiceLine as $key) {
echo "***".$key->SalesInvoiceProductLine->ProductIdentifier."==="."<br>";
}
?>
</body>
</html>
发票行作为$key){
回显“***.”$key->SalesInvoiceProductLine->ProductIdentifier。“==”
”;
如果($key->SalesInvoiceProductLine->ProductIdentifier==“运费”){
回显“找到运输成本\n”;
回音“\n”;
变量转储($key);
回音“\n”;
数组推送($index,$i);
}
$i++;
}
foreach($index作为$index){
未设置($base->InvoiceLine[$index]);
}
回声“
”---------------------------
”;
印刷费(基数);
回声“
”---------------------------
”;
foreach($base->InvoiceLine作为$key){
回显“***.”$key->SalesInvoiceProductLine->ProductIdentifier。“==”
”;
}
?>
您是如何确定它不起作用的?
<!DOCTYPE html>
<html>
<body>
<?php
$myXMLData =
'<InvoiceLines>
<InvoiceLine>
<SalesInvoiceProductLine>
<ProductIdentifier type="customer">4867895346</ProductIdentifier>
<ProductName>a name</ProductName>
<ProductUnitPrice type="net">75</ProductUnitPrice>
<ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
<SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
<Dimension>
<DimensionName>Kustannuspaikka</DimensionName>
<DimensionItem>110 Tukkukauppa kotimaa</DimensionItem>
</Dimension>
</SalesInvoiceProductLine>
</InvoiceLine>
<InvoiceLine>
<SalesInvoiceProductLine>
<ProductIdentifier type="customer">1345573456</ProductIdentifier>
<ProductName>name</ProductName>
<ProductUnitPrice type="net">31</ProductUnitPrice>
<ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
<SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
<Dimension>
<DimensionName>Kustannuspaikka</DimensionName>
<DimensionItem>150</DimensionItem>
</Dimension>
</SalesInvoiceProductLine>
</InvoiceLine>
<InvoiceLine>
<SalesInvoiceProductLine>
<ProductIdentifier type="customer">Shipping_cost</ProductIdentifier>
<ProductName>Shipping</ProductName>
<ProductUnitPrice type="net">0</ProductUnitPrice>
<ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
<SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
<SalesInvoiceProductLineDiscountPercentage>0</SalesInvoiceProductLineDiscountPercentage>
</SalesInvoiceProductLine>
</InvoiceLine>
<InvoiceLine>
<SalesInvoiceProductLine>
<ProductIdentifier type="customer">222222222</ProductIdentifier>
<ProductName>name</ProductName>
<ProductUnitPrice type="net">31</ProductUnitPrice>
<ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
<SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
<Dimension>
<DimensionName>Kustannuspaikka</DimensionName>
<DimensionItem>150</DimensionItem>
</Dimension>
</SalesInvoiceProductLine>
</InvoiceLine>
</InvoiceLines>';
$base=simplexml_load_string($myXMLData);
print_r($base);
echo "<br>------------------------<br>";
$indexes = array();
$i = 0;
//remove shipping lines, always 0 and not needed
foreach ($base->InvoiceLine as $key) {
echo "***".$key->SalesInvoiceProductLine->ProductIdentifier."==="."<br>";
if ($key->SalesInvoiceProductLine->ProductIdentifier == "Shipping_cost") {
echo "shipping cost FOUND \n";
echo "\n";
var_dump($key);
echo "\n";
array_push($indexes, $i);
}
$i++;
}
foreach($indexes as $index) {
unset($base->InvoiceLine[$index]);
}
echo "<br>------------------------<br>";
print_r($base);
echo "<br>------------------------<br>";
foreach ($base->InvoiceLine as $key) {
echo "***".$key->SalesInvoiceProductLine->ProductIdentifier."==="."<br>";
}
?>
</body>
</html>