Анализ XML файла в PHP с использованием DOM - PullRequest
0 голосов
/ 06 февраля 2020

Мне нужно проанализировать несколько XML файлов и поместить проанализированные данные в базу данных.

Структура xml выглядит следующим образом

<npc ATT1="" ATT2="" ATT3="">
  <race>DATA</race>
  <sex>DATA</sex>
  <parameters>
          <param ATT1="" ATT2="" ATT3=""/>
          <param ATT1="" ATT2="" ATT3=""/>
          <skill ATT1="" ATT2="" ATT3=""/>
          <skill ATT1="" ATT2="" ATT3=""/>
  </parameters>
  <equipment ATT1="" ATT2="" ATT3=""/>
  <acquire ATT1="" ATT2="" ATT3=""/>
  <stats ATT1="" ATT2="" ATT3="">
      <vitals ATT1="" ATT2="" ATT3=""/>
      <attack ATT1="" ATT2="" ATT3=""/>
      <defence ATT1="" ATT2="" ATT3="">
          <attribute>
              <defence ATT1="" ATT2="" ATT3=""/>
          </attribute>
      </defence>
  </stats>
  <skilllist>
      <skill ATT1="" ATT2="" ATT3=""/>
      <skill ATT1="" ATT2="" ATT3=""/>
      <skill ATT1="" ATT2="" ATT3=""/>
      <skill ATT1="" ATT2="" ATT3=""/>
  </skilllist>
  <excrteffect>DATA<excrteffect>
</npc>

Мой текущий код выглядит следующим образом:

$allFiles = scandir($_SERVER['DOCUMENT_ROOT'] . "mydir");
$files = array_diff($allFiles, array('.', '..'));
$doc = new DOMDocument();

foreach($files as $filename) {

    $xml_file = file_get_contents($_SERVER['DOCUMENT_ROOT'] . "mydir" . $filename, FILE_TEXT);
    $doc->loadXML($xml_file);
    $items = $doc->getElementsByTagName('npc');

    for ($i = 0; $i < $items->length; $i++) {

        $xml_file = file_get_contents($_SERVER['DOCUMENT_ROOT'] . "mydir" . $filename, FILE_TEXT); 
        $doc->loadXML($xml_file);

        $Id = $doc->getElementsByTagName("npc")->item($i)->getAttribute("id");
        $Name = $doc->getElementsByTagName("npc")->item($i)->getAttribute("name");
        $Lvl = $doc->getElementsByTagName("npc")->item($i)->getAttribute("level");
        $Type = $doc->getElementsByTagName("npc")->item($i)->getAttribute("type");
        $Title = $doc->getElementsByTagName("npc")->item($i)->getAttribute("title");

        $Sex = $doc->getElementsByTagName("sex")->item($i)->nodeValue;
        $Race = $doc->getElementsByTagName("race")->item($i)->nodeValue;
     }
}

Он отлично работает для данных, которые я уже закодировал, теперь мне нужно получить остальное. Как я могу получить атрибуты от остальных xml? Например, как получить атрибуты из

npc > stats > defence > attribute > defence

1 Ответ

0 голосов
/ 06 февраля 2020

Вам нужно повторить то же самое, что вы сделали сначала. Каждый getElementsByTagName() вернет DOMNodeList, что будет так же, как вы делали вначале. Если вы уверены, что ваша структура будет такой же, как у вас здесь, используйте этот код, в противном случае вам нужно выполнить итерацию с foreach или для:

<?php

$xml_file = '<npc ATT1="" ATT2="" ATT3="">
<race>DATA</race>
<sex>DATA</sex>
<parameters>
        <param ATT1="" ATT2="" ATT3=""/>
        <param ATT1="" ATT2="" ATT3=""/>
        <skill ATT1="" ATT2="" ATT3=""/>
        <skill ATT1="" ATT2="" ATT3=""/>
</parameters>
<equipment ATT1="" ATT2="" ATT3=""/>
<acquire ATT1="" ATT2="" ATT3=""/>
<stats ATT1="" ATT2="" ATT3="">
    <vitals ATT1="" ATT2="" ATT3=""/>
    <attack ATT1="" ATT2="" ATT3=""/>
    <defence ATT1="" ATT2="" ATT3="">
        <attribute>
            <defence ATT1="" ATT2="" ATT3="">150</defence>
        </attribute>
    </defence>
</stats>
<skilllist>
    <skill ATT1="" ATT2="" ATT3=""/>
    <skill ATT1="" ATT2="" ATT3=""/>
    <skill ATT1="" ATT2="" ATT3=""/>
    <skill ATT1="" ATT2="" ATT3=""/>
</skilllist>
<excrteffect>DATA</excrteffect>
</npc>';

$doc = new DOMDocument();
$doc->loadXML($xml_file);

$items = $doc->getElementsByTagName('npc');
$stats = $items[0]->getElementsByTagName('stats');
$defence1 = $stats[0]->getElementsByTagName('defence');
$attribute = $defence1[0]->getElementsByTagName('attribute');
$defence2 = $attribute[0]->getElementsByTagName('defence');

var_dump($defence2[0]->nodeValue);
...