我加载一个包含用户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和名称空间解决了它。谢谢大家的尝试!
答案 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,它允许您使用第一个参数的文件路径而不是字符串。但是,您也可以使用加载文件功能。