John Davidson

php - Convert unordered list html markup into a multidimensional array using xpath

0 comments
Message:


I am trying to create an array to reproduce the code below:


<div class="singlepost">

<ul class="linha_status" style="">
<li>Status: <b>Objeto em trânsito - por favor aguarde</b></li>
<li>Data : 24/10/2021 | Hora: 12:04</li>
<li>Origem: Unidade de Tratamento - Jaboatao Dos Guararapes / PE</li>
<li>Destino: Agência dos Correios - Cuitegi / PB</li>
</ul>

<ul class="linha_status" style="">
<li>Status: <b>Objeto em trânsito - por favor aguarde</b></li>
<li>Data : 19/10/2021 | Hora: 00:03</li>
<li>Origem: Unidade de Logística Integrada - Curitiba / PR</li>
<li>Destino: Unidade de Tratamento - Recife / PE</li>
</ul>

<ul class="linha_status" style="">
<li>Status: <b>Fiscalização aduaneira finalizada</b></li>
<li>Data : 18/10/2021 | Hora: 23:35</li>
<li>Local: Unidade Operacional - Curitiba / PR</li>
</ul>

<ul class="linha_status" style="">
<li>Status: <b>Objeto recebido pelos Correios do Brasil</b></li>
<li>Data : 16/10/2021 | Hora: 11:45</li>
<li>Local: Unidade de Logística Integrada - Curitiba / PR</li>
</ul>

<ul class="linha_status" style="">
<li>Status: <b>Objeto postado</b></li>
<li>Data : 14/10/2021 | Hora: 20:30</li>
<li>Local: País - / </li>
</ul>

</div>

I am using xpath and foreach to create the array, but got no lucky with the result... It is working, but not the output I need, this is the code I have written:


$doc = new DOMDocument();
$doc->loadHTML($htmlString);
$xpath = new DOMXPath($doc);

$geral = $xpath->evaluate('//ul[@class="linha_status"]');

foreach ($geral as $name) {
$total[] = $name->nodeValue;
}
var_dump($total);

My actual code produces this output:


  array(5) {
[0] => string(195)
" Status: Objeto em trânsito - por favor aguarde Data : 24/10/2021 | Hora: 12:04 Origem: Unidade de Tratamento - Jaboatao Dos Guararapes / PE Destino: Agência dos Correios - Cuitegi / PB"
[1] => string(189)
" Status: Objeto em trânsito - por favor aguarde Data : 19/10/2021 | Hora: 00:03 Origem: Unidade de Logística Integrada - Curitiba / PR Destino: Unidade de Tratamento - Recife / PE"
[2] => string(128)
" Status: Fiscalização aduaneira finalizada Data : 18/10/2021 | Hora: 23:35 Local: Unidade Operacional - Curitiba / PR"
[3] => string(145)
" Status: Objeto recebido pelos Correios do Brasil Data : 16/10/2021 | Hora: 11:45 Local: Unidade de Logística Integrada - Curitiba / PR"
[4] => string(83)
" Status: Objeto postado Data : 14/10/2021 | Hora: 20:30 Local: País - / "
}

This is my desired output:


"eventos": [{
"status": "Objeto em trânsito - por favor aguarde",
"data": "24/10/2021",
"hora": "12:04",
"origem": "Unidade de Tratamento - Jaboatao Dos Guararapes / PE",
"destino": "Agência dos Correios - Cuitegi / PB"
}, {
"status": "Objeto em trânsito - por favor aguarde",
"data": "19/10/2021",
"hora": "00:03",
"origem": "Unidade de Logística Integrada - Curitiba / PR",
"destino": "Unidade de Tratamento - Recife / PE"
}, {
"status": "Fiscalização aduaneira finalizada",
"data": "18/10/2021",
"hora": "23:35",
"local": "Unidade Operacional - Curitiba / PR"
}, {
"status": "Objeto recebido pelos Correios do Brasil",
"data": "16/10/2021",
"hora": "11:45",
"local": "Unidade de Logística Integrada - Curitiba / PR"
}, {
"status": "Objeto postado",
"data": "14/10/2021",
"hora": "20:30",
"local": "País - /"
}]


My Answer:
To achieve the desired output, you need to modify your code to extract the individual elements (status, data, hora, origem, destino) from each `
    ` element and then create an array with those elements. Here's the updated code:

    php
    $doc = new DOMDocument();
    $doc->loadHTML($htmlString);
    $xpath = new DOMXPath($doc);

    $geral = $xpath->evaluate('//ul[@class="linha_status"]');

    $total = [];

    foreach ($geral as $ul) {
    $item = [];
    $liList = $ul->getElementsByTagName('li');

    foreach ($liList as $li) {
    $text = $li->nodeValue;
    $parts = explode(':', $text);
    $key = trim($parts[0]);
    $value = trim($parts[1]);

    switch ($key) {
    case 'Status':
    $item['status'] = $value;
    break;
    case 'Data':
    $item['data'] = substr($value, 0, 10);
    $item['hora'] = substr($value, 13);
    break;
    case 'Origem':
    $item['origem'] = $value;
    break;
    case 'Destino':
    $item['destino'] = $value;
    break;
    case 'Local':
    $item['local'] = $value;
    break;
    }
    }

    $total['eventos'][] = $item;
    }

    echo json_encode($total, JSON_PRETTY_PRINT);


    This code will extract the status, data, hora, origem, and destino/local from each `
      ` element and create an array with those elements. Finally, it will output the array as a JSON string with the desired format.

Rate this post

3 of 5 based on 3921 votes

Comments




© 2024 Hayatsk.info - Personal Blogs Platform. All Rights Reserved.
Create blog  |  Privacy Policy  |  Terms & Conditions  |  Contact Us