使用PHP解析高级XML文件

时间:2016-02-06 19:14:46

标签: php xml xpath

我目前有一个1.6mb的XML文件,我在逻辑上缠绕我的头很麻烦。

格式是这样的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<imgdir name="Map.img">
    <imgdir name="3rd">
        <imgdir name="300000000">
            <string name="streetName" value="Ellin Forest"/>
            <string name="mapName" value="Altaire Camp"/>
        </imgdir>
    </imgdir>
    <imgdir name="4th">
        <imgdir name="400000000">
            <string name="streetName" value="asd"/>
            <string name="mapName" value="yolo"/>
        </imgdir>
    </imgdir>
</imgdir>

我想在给定的imgdir中使用数字值访问mapName属性,因为300000000将返回&#34; Altaire Camp&#34;。

我已经尝试了相当多的代码来完成这项工作,而我甚至还没有接近。我甚至尝试了一些$ xml-&gt; xpath(&#39; // 300000000&#39;)的行,看看我是否可以通过它来访问名为mapName的字符串子项,但是没有成功。

我也试过这个:

if (file_exists('Map.xml')) {
    $xml = simplexml_load_file('Map.xml');

    foreach ($xml->imgdir as $imgdir) 
    {
        echo $imgdir["name"] . "\n";
    }
} 

返回第3,第4等等。 我似乎无法获得字符串名称=&#34; mapName&#34;我做的任何事情。

编辑: 谢谢大家,我选择了这个解决方案:

function GetMapNameByID($id)
{
    if (file_exists('Map.xml')) 
    {
        $xml = simplexml_load_file('Map.xml');

        $nodes = $xml->xpath("//imgdir[@name='$id']");

        foreach($nodes as $node) 
        {
            return $node->string[1]["value"];
        }
    }
}

它返回我想要的值。

2 个答案:

答案 0 :(得分:0)

你的xpath错了。你需要使用

$xml->xpath("//imgdir[@name='300000000']/string[@name='mapName']/@value")[0];

这将首先选择名称属性等于 300000000 imgdir 元素,无论它有多深。然后它选择名称属性等于 mapName string 子元素,最后选择 string 属性 string / em>的

最后,我们拉出返回的数组的第一个元素,这将是您想要的值。

答案 1 :(得分:0)

此代码适用于我:

$xmlstr = <<<XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<imgdir name="Map.img">
  <imgdir name="3rd">
    <imgdir name="300000000">
      <string name="streetName" value="Ellin Forest"/>
      <string name="mapName" value="Altaire Camp"/>
    </imgdir>
  </imgdir>
  <imgdir name="4th">
    <imgdir name="400000000">
      <string name="streetName" value="asd"/>
      <string name="mapName" value="yolo"/>
    </imgdir>
  </imgdir>
</imgdir>
XML;

$xml = new SimpleXMLElement($xmlstr);
foreach ($xml->imgdir as $imgdir) {
  echo '<div>Directory Name = ' . $imgdir->imgdir['name'] . '</div>';
  echo '<div>mapName = ' . $imgdir->imgdir->string[1]['value'] . '</div>';
}