使用 DOM 在 PHP 中解析 XML 文件

Posted

技术标签:

【中文标题】使用 DOM 在 PHP 中解析 XML 文件【英文标题】:Parse XML file in PHP using DOM 【发布时间】:2020-05-22 22:43:07 【问题描述】:

我需要解析多个 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

【问题讨论】:

虽然有一定的学习曲线,但我建议学习一些 XPath,因为这会让你的代码更加简洁。 感谢您的建议,有空就去做。 【参考方案1】:

您需要以与最初相同的方式进行迭代。每个getElementsByTagName() 都将返回一个DOMNodeList,这与您最初所做的方式相同。如果你确定你的结构和你这里的一样,那么使用这个代码,否则你需要用 foreach 或 for 进行迭代:

<?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);

【讨论】:

以上是关于使用 DOM 在 PHP 中解析 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

PHP 创建与解析 XML

JAVA中使用DOM解析XML文件

使用dom4j创建和解析xml文件

Android Dom和XmlPullParse解析XML文件

Java:简单的解析XML文件之使用DOM解析

Android -使用DOM(文档对象模型)解析XML文件