douju9847 2016-06-02 13:13
浏览 52
已采纳

PHP:重新组合XML属性

I'm tried to parse XML response with DOM.

<GetBilletResult>
    <sNomProduit>product 2</sNomProduit>
    <sNomArticle>article 4</sNomArticle>
    ...
    <tabGrilleHoraire>
        <tabDetailTarifArticle>
            <tabDetail>
              <sDetail>Liste Pax : Pax n°1 [Âge:19]</sDetail>
              <sAgePax>19;</sAgePax>
              ...
            </tabDetail>
        </tabDetailTarifArticle>
        ...
    <tabGrilleHoraire>
</GetBilletResult>

I need to reorder the result and regroup the articles by products. The output should look like this :

  • sNomProduit : product 2

  • sNomArticle : article 1

  • tabGrilleHoraire

    • tabDetailTarifArticle
      • tabDetail
        • sDetail : Liste Pax : Pax n°1 [Âge:19]
        • sAgePax : 19;

Working code (thanks to ConstantineUA) :

$processed = array();
foreach( $billets as $GetBilletResult )
{ 
$sNomProduit = $GetBilletResult->getElementsByTagName( "sNomProduit" )->item(0)->nodeValue;
$nIDProduit = $GetBilletResult->getElementsByTagName( "nIDProduit" )->item(0)->nodeValue;
$sNomArticle = $GetBilletResult->getElementsByTagName( "sNomArticle" )->item(0)->nodeValue;
$nIDArticle = $GetBilletResult->getElementsByTagName( "nIDArticle" )->item(0)->nodeValue;
$tabDetail = $GetBilletResult->getElementsByTagName( "tabDetail" );

if (!isset($processed[$sNomProduit])) {
     $processed[$sNomProduit] = array();
}

$processed[$sNomProduit][] = array(
     'nIDProduit' => $nIDProduit,
     'sNomArticle' => $sNomArticle,
     'nIDArticle' => $nIDArticle,
     'tabDetail' => $tabDetail,
);
}

Loop:

foreach ($processed as $sNomProduit => $list) {
    echo "<h3> ".$sNomProduit."</h3>";
    foreach ($list as $item) {
        echo "<h5> ".$item['sNomArticle'] . "</h5>";
        foreach ($item['tabDetail'] as $node) {
            var_dump ($node->nodeValue);
        }
    }
    echo "<hr>";
}
  • 写回答

1条回答 默认 最新

  • duanhun3273 2016-06-02 13:45
    关注

    I think you can get by with an additional associative array where you put all you nodes during the loop:

    $processed = array();
    foreach( $billets as $GetBilletResult )
    { 
        $sNomProduit = $GetBilletResult->getElementsByTagName( "sNomProduit" )->item(0)->nodeValue;
        $nIDProduit = $GetBilletResult->getElementsByTagName( "nIDProduit" )->item(0)->nodeValue;
        $sNomArticle = $GetBilletResult->getElementsByTagName( "sNomArticle" )->item(0)->nodeValue;
        $nIDArticle = $GetBilletResult->getElementsByTagName( "nIDArticle" )->item(0)->nodeValue;
    
        if (!isset($processed[$sNomProduit])) {
             $processed[$sNomProduit] = array();
        }
    
        $processed[$sNomProduit][] = array(
             'nIDProduit' => $nIDProduit,
             'sNomArticle' => $sNomArticle,
             'nIDArticle' => $nIDArticle,
        );
    }
    

    And then loop through this array to display results:

    foreach ($processed as $sNomProduit => $list) {
        echo "<b>sNomProduit : </b> ".$sNomProduit."<br>";
        foreach ($list as $item) {
            echo "<b>sNomArticle : </b> ".$item['sNomArticle'] . "<br>";
            echo "<b>ListeTranche </b> ID_Tranche ".$item['nIDArticle'] . "<br>";
        }
    }
    

    It looks that your xml isn't complete so please note that it's more like a pseudo-code rather than a complete solution.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 pb数据库修改或者求完整pb库存系统,需为pb自带数据库
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路