使用 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 文件的主要内容,如果未能解决你的问题,请参考以下文章