Конвертировать таблицу HTML в XML с помощью PHP (DOMDocument?) - PullRequest
0 голосов
/ 31 октября 2018

Я хочу преобразовать приведенную ниже разметку таблицы HTML в формат XML.

<table class='tbl-class'>
  <thead>
    <tr>
      <th>Island</th>
      <th>Number of nights</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Guadeloupe</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Antigua</td>
      <td>5</td>
    </tr>
  <tbody>
</table>

В идеале хотелось бы, чтобы вывод XML был примерно таким:

<location>
  <island>Guadeloupe</island>
  <nights>1</nights>
</location>
<location>
  <island>Antigua</island>
  <nights>5</nights>
</location>

В настоящее время я пытаюсь использовать DOMDocument для этого, но у меня мало опыта, чтобы добраться куда угодно. Пока я сделал следующее: - Я думаю, что в цикле foreach мне нужно сделать гораздо больше, но я не уверен, что ..

$doc = new DOMDocument();
$doc->load($convertedString);
$classname = 'tbl-class';
$finder = new DomXPath($doc);
$nodes = $finder->query("//*[contains(@class, '$classname')]");

foreach ($nodes as $node) {
  $node->parentNode->removeChild($node);
}

$convertedString = $doc->saveHTML();

1 Ответ

0 голосов
/ 31 октября 2018

Я считаю, что использование SimpleXML, как следует из названия, проще. Этот код читает XML и, как у вас, - находит элемент <table>.

Затем, используя foreach(), он использует способность SimpleXML ссылаться на иерархию элементов как объекты, поэтому $table[0]->tbody->tr относится к элементам <tr> в разделе <tbody> таблицы.

Затем он объединяет каждый из элементов <td> с соответствующей меткой из $headers ...

$xml= simplexml_load_string($convertedString);

$classname = 'tbl-class';
$table = $xml->xpath("//*[contains(@class, '$classname')]");

$headers = ["island", "nights"];
$out = new SimpleXMLElement("<locations />");
foreach ( $table[0]->tbody->tr as $tr ){
    $location = $out->addChild("location");
    $key = 0;
    foreach ( $tr->td as $td )  {
        $location->addChild($headers[$key++], (string)$td);
    }
}

echo $out->asXML();
...