Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在foreach循环中取消设置特定节点_Php_Simplexml - Fatal编程技术网

Php 在foreach循环中取消设置特定节点

Php 在foreach循环中取消设置特定节点,php,simplexml,Php,Simplexml,我完全被困在这里了 我在PHP中有一个简单的xml结构 <InvoiceLines> <InvoiceLine> <SalesInvoiceProductLine> <ProductIdentifier type="customer">4867895346</ProductIdentifier> <ProductName>a name</ProductName

我完全被困在这里了

我在PHP中有一个简单的xml结构

<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>