php DOMXpath,帮助获取节点值

php DOMXpath,帮助获取节点值,php,xml,xpath,domxpath,Php,Xml,Xpath,Domxpath,我有以下XML: <?xml version="1.0" encoding="utf-8"?> <cfdi:Comprobante > <cfdi:Conceptos> <cfdi:Concepto cantidad="1.00" unidad="PZA" noIdentificacion="RRGARACION" descripcion="51571 CADENA ORO AMRILLO 45CMTS FAVOR DE SOLDAR EL ESLABO

我有以下XML:

<?xml version="1.0" encoding="utf-8"?>
<cfdi:Comprobante >
<cfdi:Conceptos>
<cfdi:Concepto cantidad="1.00" unidad="PZA" noIdentificacion="RRGARACION" descripcion="51571 CADENA ORO AMRILLO 45CMTS FAVOR DE SOLDAR EL ESLABON DE LADO DEL BROCHE" valorUnitario="81.90" importe="81.90" />
<cfdi:Concepto cantidad="1.00" unidad="PZA" noIdentificacion="RRGARACION" descripcion="51570 CADENA ORO BLANCO C/CORAZON FAVOR DE SOLDAR A 16 CMTS DEL BROCHE" valorUnitario="206.90" importe="206.90" />
<cfdi:/Conceptos>
<cfdi:Impuestos>
<cfdi:Traslados>
<cfdi:Traslado impuesto="IVA" tasa="16" importe="46.20" />
</cfdi:Traslados>
</cfdi:Impuestos>
</cfdi:Comprobante>

但是没有起作用。

对XML进行了一些更正(添加名称空间并将/移到
的开头)

在XML中,您必须在xpath对象中注册名称空间,以便它可以使用它,并且xpath表达式本身也会更新

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$xml= <<< XML
<?xml version="1.0" encoding="utf-8"?>
<Comprobante xmlns:cfdi="cfdi">
    <cfdi:Conceptos>
        <cfdi:Concepto cantidad="1.00" unidad="PZA" 
            noIdentificacion="RRGARACION" 
            descripcion="51571 CADENA ORO AMRILLO 45CMTS FAVOR DE SOLDAR EL ESLABON DE LADO DEL BROCHE" valorUnitario="81.90" importe="81.90" />
        <cfdi:Concepto cantidad="1.00" unidad="PZA" 
            noIdentificacion="RRGARACION" 
            descripcion="51570 CADENA ORO BLANCO C/CORAZON FAVOR DE SOLDAR A 16 CMTS DEL BROCHE" valorUnitario="206.90" importe="206.90" />
    </cfdi:Conceptos>
    <cfdi:Impuestos>
        <cfdi:Traslados>
            <cfdi:Traslado impuesto="IVA" tasa="16" importe="46.20" />
        </cfdi:Traslados>
    </cfdi:Impuestos>
</Comprobante>
XML;

$doc = new DOMDocument();
$doc->loadXML($xml);
$xp = new DOMXpath($doc);
$xp->registerNamespace('cfdi', 'cfdi');
print_r( $xp->query("//cfdi:Traslados/*[@impuesto='IVA']/@importe"));

XML;
$doc=新的DOMDocument();
$doc->loadXML($xml);
$xp=新的DOMXpath($doc);
$xp->registerNamespace('cfdi','cfdi');
打印($xp->query(//cfdi:Traslados/*[@imputesto='IVA']/@import”);

对XML有几处更正(添加名称空间并将/移到
的开头)

在XML中,您必须在xpath对象中注册名称空间,以便它可以使用它,并且xpath表达式本身也会更新

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$xml= <<< XML
<?xml version="1.0" encoding="utf-8"?>
<Comprobante xmlns:cfdi="cfdi">
    <cfdi:Conceptos>
        <cfdi:Concepto cantidad="1.00" unidad="PZA" 
            noIdentificacion="RRGARACION" 
            descripcion="51571 CADENA ORO AMRILLO 45CMTS FAVOR DE SOLDAR EL ESLABON DE LADO DEL BROCHE" valorUnitario="81.90" importe="81.90" />
        <cfdi:Concepto cantidad="1.00" unidad="PZA" 
            noIdentificacion="RRGARACION" 
            descripcion="51570 CADENA ORO BLANCO C/CORAZON FAVOR DE SOLDAR A 16 CMTS DEL BROCHE" valorUnitario="206.90" importe="206.90" />
    </cfdi:Conceptos>
    <cfdi:Impuestos>
        <cfdi:Traslados>
            <cfdi:Traslado impuesto="IVA" tasa="16" importe="46.20" />
        </cfdi:Traslados>
    </cfdi:Impuestos>
</Comprobante>
XML;

$doc = new DOMDocument();
$doc->loadXML($xml);
$xp = new DOMXpath($doc);
$xp->registerNamespace('cfdi', 'cfdi');
print_r( $xp->query("//cfdi:Traslados/*[@impuesto='IVA']/@importe"));

XML;
$doc=新的DOMDocument();
$doc->loadXML($xml);
$xp=新的DOMXpath($doc);
$xp->registerNamespace('cfdi','cfdi');
打印($xp->query(//cfdi:Traslados/*[@imputesto='IVA']/@import”);

首先,您使用的是无效的XML。它应该如下所示:

$xp = new DOMXpath($xml);
$data['IVA']= getpath("//@Traslados[@impuesto='IVA']/@importe");
<?xml version="1.0" encoding="utf-8"?>
<cfdi:Comprobante xmlns:cfdi="https://some/uri">
    <cfdi:Conceptos>
        <cfdi:Concepto cantidad="1.00" unidad="PZA" noIdentificacion="RRGARACION" descripcion="51571 CADENA ORO AMRILLO 45CMTS FAVOR DE SOLDAR EL ESLABON DE LADO DEL BROCHE" valorUnitario="81.90" importe="81.90" />
        <cfdi:Concepto cantidad="1.00" unidad="PZA" noIdentificacion="RRGARACION" descripcion="51570 CADENA ORO BLANCO C/CORAZON FAVOR DE SOLDAR A 16 CMTS DEL BROCHE" valorUnitario="206.90" importe="206.90" />
    </cfdi:Conceptos>
    <cfdi:Impuestos>
        <cfdi:Traslados>
            <cfdi:Traslado impuesto="IVA" tasa="16" importe="46.20" />
        </cfdi:Traslados>
    </cfdi:Impuestos>
</cfdi:Comprobante>

因此,对于初学者来说,您使用的是无效的XML

$xp = new DOMXpath($xml);
$data['IVA']= getpath("//@Traslados[@impuesto='IVA']/@importe");
<?xml version="1.0" encoding="utf-8"?>
<cfdi:Comprobante xmlns:cfdi="https://some/uri">
    <cfdi:Conceptos>
        <cfdi:Concepto cantidad="1.00" unidad="PZA" noIdentificacion="RRGARACION" descripcion="51571 CADENA ORO AMRILLO 45CMTS FAVOR DE SOLDAR EL ESLABON DE LADO DEL BROCHE" valorUnitario="81.90" importe="81.90" />
        <cfdi:Concepto cantidad="1.00" unidad="PZA" noIdentificacion="RRGARACION" descripcion="51570 CADENA ORO BLANCO C/CORAZON FAVOR DE SOLDAR A 16 CMTS DEL BROCHE" valorUnitario="206.90" importe="206.90" />
    </cfdi:Conceptos>
    <cfdi:Impuestos>
        <cfdi:Traslados>
            <cfdi:Traslado impuesto="IVA" tasa="16" importe="46.20" />
        </cfdi:Traslados>
    </cfdi:Impuestos>
</cfdi:Comprobante>

请查看更具体的答案。您的XML正在使用名称空间(cfdi:part提供了名称空间)。它们需要得到适当的处理。这不是有效的XML,cfdi名称空间应该使用
xmlns
属性声明。请查看更具体的答案。您的XML正在使用名称空间(中国食品药品监督管理委员会:第二部分公布)这不是有效的XML,cfdi名称空间应该用
xmlns
属性声明。哦!更恼人的是我修复了XPath而没有复制它…哦,好吧,主要的是有一个有效的答案。哦!更恼人的是我修复了XPath而没有复制它…哦,好吧,主要的是问题是有一个有效的答案。