根据子内容解析xml属性

时间:2010-12-31 01:30:47

标签: php xml parsing match

我加载一个包含用户metas的外部xml文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<user_information>
<user url="http://usersweb.com">
<name>Arnold</name>
<lastname>
<name>Arnoldson</name>
</lastname>
<age>42</age>
</user>
<user url="http://anotheruserweb.com">
<name>Arnold</name>
<lastname>
<name>Arichson</name>
</lastname>
<age>42</age>
</user>
And so on....
</user_information>

我知道格式化

<lastname> 

非常愚蠢,但我无法修改来源。

我想从

加载“url” - 属性
<user>

,但仅限于

<name> 

<lastname> 

匹配我在自己的用户数据库中存储的名称值。

我知道如何用PHP解析其余部分,但只是匹配序列对我来说似乎很难。任何帮助表示赞赏!


修改 由于我无法提供源XML,我在Spotify Metadata API中找到了类似的代码结构。我们可以使用跟踪搜索“Domino Dancing”中返回的XML文件进行实验:ws.spotify.com/search/1/track?q=Domino Dancing

它具有完全相同的结构,除了使用其他单词。返回的文件如下所示:

<?xml version="1.0" encoding="utf-8"?> 
<tracks xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns="http://www.spotify.com/ns/music/1"> 
<opensearch:Query role="request" startPage="1" searchTerms="Domino Dancing"/> 
<opensearch:totalResults>39</opensearch:totalResults> 
<opensearch:startIndex>0</opensearch:startIndex> 
<opensearch:itemsPerPage>100</opensearch:itemsPerPage> 
<track href="spotify:track:2aV5vCNH5tOOe0GGKqfx5Z"> 
<name>Domino dancing</name> 
<artist href="spotify:artist:2ycnb8Er79LoH2AsR5ldjh"> 
<name>Pet Shop Boys</name> 
</artist> 
<id type="isrc">GBAYE0301704</id> 
<album href="spotify:album:0BAfuhzkGjckMhsL2gVbzR"> 
<name>Ultimate</name> 
<released>2010</released> 
<availability> 
<territories>AT BE CH CY CZ DE DK EE ES FI FR GB GR HR HU IE IT LT LU NL NO PL PT RO SE SI SK</territories> 
</availability> 
</album> 
<track-number>7</track-number> 
<length>258.106000</length> 
<popularity>0.57092</popularity> 
</track> 
<track href="spotify:track:4mVLzFbc3gaCoWCEENLouc"> 
<name>Domino Dancing</name> 
<artist href="spotify:artist:2ycnb8Er79LoH2AsR5ldjh"> 
<name>Pet Shop Boys</name> 
</artist> 
<id type="isrc">GBAYE8800056</id> 
<album href="spotify:album:0Jt2LzWgtGxy3GZH5i2Kcy"> 
<name>Discography - Complete Singles Collection</name> 
<released>1991</released> 
<availability> 
<territories>AT BE CH CY CZ DE DK EE ES FI FR GB GR HR HU IE IT LT LU NL NO PL PT RO SE SI SK</territories> 
</availability> 
</album> 
<track-number>10</track-number> 
<length>258.333000</length> 
<popularity>0.56159</popularity> 
</track> 
<track href="spotify:track:72kgJ1brMxxeDiPNdH6qqW"> 
<name>Viva la vida/Domino dancing</name> 
<artist href="spotify:artist:2ycnb8Er79LoH2AsR5ldjh"> 
<name>Pet Shop Boys</name> 
</artist> 
<id type="isrc">GBCEW0900049</id> 
<album href="spotify:album:4DZfMTDyBwnJQ0k1PaT6U4"> 
<name>Pet Shop Boys Christmas</name> 
<released>2009</released> 
<availability> 
<territories>AT BE CH CY CZ DE DK EE ES FI FR GB GR HR HU IE IT LT LU NL NO PL PT RO SE SI SK</territories> 
</availability> 
</album> 
<track-number>4</track-number> 
<length>333.507000</length> 
<popularity>0.51961</popularity> 
</track>
</tracks>

如果我们假装那样 user_information =磁道 用户=轨迹 URL = HREF 姓氏=艺术家。

希望这有帮助!

EDIT2: 我使用Xpath Document和名称空间解决了它。谢谢大家的尝试!

2 个答案:

答案 0 :(得分:1)

此XPATH为Arnold Archison选择@url

/user_information/user[name='Arnold' and lastname/name='Arichson']/@url

修改

  

关于您的解决方案的两个问题:1。   我可以使用xpath吗?   simplexml_load_file而不是   的SimpleXMLElement?我可以更换   价值Arnold Arichson的变量值   比如$ users_firstname和   $ users_lastname =

我不是一个PHP人,但我相信你应该可以做这样的事情(你可能需要以不同的方式连接XPATH字符串,或者可能不需要转义单引号,不确定):< / p>

<?php

$first = "Arnold";
$last = "Arichson";

$userInfo =  simplexml_load_file('http://your.website.com/user_information.xml');

foreach ($userInfo->xpath("/user_information/user[name=\'$first\' and lastname/name=\'$last\']/@url") as $url) {
  echo "<h2>" . $url . "</h2>";
}
?>

答案 1 :(得分:0)

$xml = new SimpleXMLElement($xml_string);
foreach ($xml->user as $value) {
   if ($value->name == $x && $value->lastname->name == $y) {
      $attr = $value->attributes();
      echo $attr['url'];
   }
}

这会将xml字符串加载到一个简单的xml对象中,然后比较节点值,如果它们与您想要的名称($x$y)匹配,则打印该URL。如果需要,您还可以加载xml文件而不是字符串来创建simplexml对象。有关详细信息,请参阅simplexml文档。

ADDITION

使用字符串(测试和工作):

<?php
    $xml_input = <<<XML
<user_information> <user url="http://usersweb.com"> <name>Arnold</name> <lastname> <name>Arnoldson</name> </lastname> <age>42</age> </user> <user url="http://anotheruserweb.com"> <name>Arnold</name> <lastname> <name>Arichson</name> </lastname> <age>42</age> </user></user_information>
XML;

$xml = new SimpleXMLElement($xml_input); 
foreach ($xml->user as $value) {
    if ($value->name == 'Arnold' && $value->lastname->name == 'Arnoldson') {
        $attr = $value->attributes();
        echo $attr['url'];
    }
} 
?>

使用文件(应该完全相同):

<?php
    $xml = new SimpleXMLElement($xml_file_path, 0, true); 
    foreach ($xml->user as $value) {
        if ($value->name == 'Arnold' && $value->lastname->name == 'Arnoldson') {
            $attr = $value->attributes();
            echo $attr['url'];
        }
    } 
?>

在对象构造中,我添加了参数0和true,它允许您使用第一个参数的文件路径而不是字符串。但是,您也可以使用加载文件功能。