如何在PHP中从XML中获取和读取特定数据?

如何在PHP中从XML中获取和读取特定数据?,php,xml,xpath,Php,Xml,Xpath,大家好,我有这个XML结构,我想获得IdDocumento属性的值 <pago10:Pagos> <pago10:Pago> <pago10:DoctoRelacionado IdDocumento="B670AD5D-8BA6-42CF-A0D0-1A403E042FBA" /> </pago10:Pago> <pago10:Pago> <pago10:DoctoRelac

大家好,我有这个XML结构,我想获得
IdDocumento
属性的值

<pago10:Pagos>
    <pago10:Pago>
        <pago10:DoctoRelacionado IdDocumento="B670AD5D-8BA6-42CF-A0D0-1A403E042FBA" />
    </pago10:Pago>
    <pago10:Pago>
        <pago10:DoctoRelacionado IdDocumento="B670AD5D-8BA6-42CF-A0D0-1A403E042FBA" />
        <pago10:DoctoRelacionado IdDocumento="842b32ce-44c1-4b31-96b8-3a34569c698c" />
    </pago10:Pago>
</pago10:Pagos>

我尝试过以下方法:

$xml = simplexml_load_file('complemento.xml');

$ns = $xml->getNamespaces(true);

$xml->registerXPathNamespace('p', $ns['pago10']);


if ($xml->xpath('//p:Pagos')) {

    foreach ($xml->xpath('//p:Pagos') as $pagos10) {

        foreach ($xml->xpath('//p:Pago') as $pago10) {

            foreach ($xml->xpath('//p:DoctoRelacionado') as $doc) {

                echo $doc['IdDocumento'] . '<br>';
            }

            echo "=========================================";
        }
    }
}
$xml=simplexml\u加载文件('complemento.xml');
$ns=$xml->getnamespace(true);
$xml->registerXPathNamespace('p',$ns['pago10']);
if($xml->xpath('//p:Pagos')){
foreach($xml->xpath('//p:Pagos')作为$pagos10){
foreach($xml->xpath('//p:Pago')作为$pago10){
foreach($xml->xpath('//p:DoctoRelacionado')作为$doc){
echo$doc['IdDocumento']。
; } 回声“==================================================================================”; } } }
但这同时显示了3个属性
IdDocumento
,我希望打印第一个属性 属性
IdDocumento
并设置分隔符,然后打印另外两个,如何知道是哪一个 IdDocumento属于每个
pago10:Pago
节点

预期结果:

B670AD5D-8BA6-42CF-A0D0-1A403E042FB

========================================

B670AD5D-8BA6-42CF-A0D0-1A403E042FBA

842b32ce-44c1-4b31-96b8-3a34569c698c

我得到的是:

B670AD5D-8BA6-42CF-A0D0-1A403E042FB

B670AD5D-8BA6-42CF-A0D0-1A403E042FBA

842b32ce-44c1-4b31-96b8-3a34569c698c

========================================

B670AD5D-8BA6-42CF-A0D0-1A403E042FB

B670AD5D-8BA6-42CF-A0D0-1A403E042FBA


842b32ce-44c1-4b31-96b8-3a34569c698c

问题之一是您总是使用
$xml
作为XPath的起点,因此这总是返回到文档的顶层以查找下一层元素。在此代码中,它使用前面的
foreach()
中的元素作为起点

$ns = $xml->getNamespaces(true);

$xml->registerXPathNamespace('pago10', $ns['pago10']);

if ($xml->xpath('//pago10:Pagos')) {
    foreach ($xml->xpath('//pago10:Pagos') as $pagos10) {
        foreach ($pagos10->xpath('descendant::pago10:Pago') as $pago10) {
            foreach ($pago10->xpath('descendant::pago10:DoctoRelacionado') as $doc) {

                echo $doc['IdDocumento'] . '<br>';
            }

            echo "=========================================".PHP_EOL;
        }
    }
}
还请注意,它使用子体轴(
“子体::
),因此它只使用位于起点下的元素

$ns = $xml->getNamespaces(true);

$xml->registerXPathNamespace('pago10', $ns['pago10']);

if ($xml->xpath('//pago10:Pagos')) {
    foreach ($xml->xpath('//pago10:Pagos') as $pagos10) {
        foreach ($pagos10->xpath('descendant::pago10:Pago') as $pago10) {
            foreach ($pago10->xpath('descendant::pago10:DoctoRelacionado') as $doc) {

                echo $doc['IdDocumento'] . '<br>';
            }

            echo "=========================================".PHP_EOL;
        }
    }
}
$ns=$xml->getnamespace(true);
$xml->registerXPathNamespace('pago10',$ns['pago10']);
if($xml->xpath('//pago10:Pagos')){
foreach($xml->xpath('//pago10:Pagos')作为$pagos10){
foreach($pagos10->xpath('genderant::pago10:Pago')作为$pago10){
foreach($pago10->xpath('genderant::pago10:DoctoRelacionado')作为$doc){
echo$doc['IdDocumento']。
; } echo“===================================================================”.PHP_EOL; } } }
问题之一是,您总是使用
$xml
作为XPath的起点,因此这总是返回到文档的顶层以查找下一层元素。在此代码中,它使用前面的
foreach()
中的元素作为起点

$ns = $xml->getNamespaces(true);

$xml->registerXPathNamespace('pago10', $ns['pago10']);

if ($xml->xpath('//pago10:Pagos')) {
    foreach ($xml->xpath('//pago10:Pagos') as $pagos10) {
        foreach ($pagos10->xpath('descendant::pago10:Pago') as $pago10) {
            foreach ($pago10->xpath('descendant::pago10:DoctoRelacionado') as $doc) {

                echo $doc['IdDocumento'] . '<br>';
            }

            echo "=========================================".PHP_EOL;
        }
    }
}
还请注意,它使用子体轴(
“子体::
),因此它只使用位于起点下的元素

$ns = $xml->getNamespaces(true);

$xml->registerXPathNamespace('pago10', $ns['pago10']);

if ($xml->xpath('//pago10:Pagos')) {
    foreach ($xml->xpath('//pago10:Pagos') as $pagos10) {
        foreach ($pagos10->xpath('descendant::pago10:Pago') as $pago10) {
            foreach ($pago10->xpath('descendant::pago10:DoctoRelacionado') as $doc) {

                echo $doc['IdDocumento'] . '<br>';
            }

            echo "=========================================".PHP_EOL;
        }
    }
}
$ns=$xml->getnamespace(true);
$xml->registerXPathNamespace('pago10',$ns['pago10']);
if($xml->xpath('//pago10:Pagos')){
foreach($xml->xpath('//pago10:Pagos')作为$pagos10){
foreach($pagos10->xpath('genderant::pago10:Pago')作为$pago10){
foreach($pago10->xpath('genderant::pago10:DoctoRelacionado')作为$doc){
echo$doc['IdDocumento']。
; } echo“===================================================================”.PHP_EOL; } } }
问题在于您的
xpath
,因为
$xml->xpath('//p:DoctoRelacionado')
将获得所有
DoctoRelacionado
项目,而不仅仅是当前
Pago
中的项目

相反,只有第一个
foreach
应该使用xpath,其他的应该使用类似
simplexmlement
children()
方法

要解决此问题,请尝试切换以下内容的
foreach
语句:

foreach ($xml->xpath('//p:Pagos') as $pagos10) {
    foreach ($pagos10->children() as $pago10) {
        foreach ($pago10->children() as $doc) {
            echo $doc['IdDocumento'] . '<br>';
        }
        echo "=========================================<br>";
    }
}
foreach($xml->xpath('//p:Pagos')作为$pagos10){
foreach($pagos10->children()作为$pago10){
foreach($pago10->children()作为$doc){
echo$doc['IdDocumento']。
; } 回声“==========================================================
”; } }
问题在于您的
xpath
,因为
$xml->xpath('//p:DoctoRelacionado')
将获得所有
DoctoRelacionado
项目,而不仅仅是当前
Pago
中的项目

相反,只有第一个
foreach
应该使用xpath,其他的应该使用类似
simplexmlement
children()
方法

要解决此问题,请尝试切换以下内容的
foreach
语句:

foreach ($xml->xpath('//p:Pagos') as $pagos10) {
    foreach ($pagos10->children() as $pago10) {
        foreach ($pago10->children() as $doc) {
            echo $doc['IdDocumento'] . '<br>';
        }
        echo "=========================================<br>";
    }
}
foreach($xml->xpath('//p:Pagos')作为$pagos10){
foreach($pagos10->children()作为$pago10){
foreach($pago10->children()作为$doc){
echo$doc['IdDocumento']。
; } 回声“==========================================================
”; } }
这非常有效,非常感谢,我不知道如何在下查找元素。这非常有效,非常感谢,我不知道如何在下查找元素。