Php 如何使用simplexml通过属性值获取xml节点值?
我有一些由外部服务生成的xml,如下所示:Php 如何使用simplexml通过属性值获取xml节点值?,php,xml,simplexml,Php,Xml,Simplexml,我有一些由外部服务生成的xml,如下所示: <data> <eventlist> <events> <event id="123"> <eventdescription lang="de">description_de</eventdescription> <eventdescription lang="en
<data>
<eventlist>
<events>
<event id="123">
<eventdescription lang="de">description_de</eventdescription>
<eventdescription lang="en">descrition_en</eventdescription>
</event>
<event id="456">
<eventdescription lang="de">description_de</eventdescription>
<eventdescription lang="en">descrition_en</eventdescription>
</event>
</events>
</eventlist>
</data>
现在,我想基于$lang
变量以正确的语言获取每个事件的eventdescription的字符串/文本。因此,如果设置为de
,我希望所有描述都具有属性lang=“de”
我试过了
echo( $event->eventdescription[0]);
哪种方法有效(假设de
和en
的顺序总是相同的),但使用var\u dump表明,它不仅仅是字符串
array (size=1)
0 =>
object(SimpleXMLElement)[3]
public '@attributes' =>
array (size=1)
'lang' => string 'de' (length=2)
public 0 => string 'description_de' (length=14)
那么,如何仅获取
eventdescription
节点的字符串呢?如果语言的顺序不总是相同的,有没有更好的方法来选择语言?在别处回答,但使用XPATH:
$events = $responseXml->xpath('//data[eventlist[events[event[eventdescription[@lang="de"]]]]]');
或者使用您的循环:
$lang = 'de';
foreach($responseXml->eventlist->events->children() as $event){
$description = (string) current($event->xpath('eventdescription[@lang="'.$lang.'"]'));
}
再次使用XPath,但只是一个示例,说明如何使用它为特定翻译构建字符串列表
$requestUrl = <<<XML
<data>
<eventlist>
<events>
<event id="123">
<eventdescription lang="de">description_de123</eventdescription>
<eventdescription lang="en">descrition_en123</eventdescription>
</event>
<event id="456">
<eventdescription lang="de">description_de456</eventdescription>
<eventdescription lang="en">descrition_en456</eventdescription>
</event>
</events>
</eventlist>
</data>
XML;
$responseXml = simplexml_load_string($requestUrl);
$lang = 'de';
$trans = [];
foreach($responseXml->xpath("//event[eventdescription[@lang='$lang']]") as $event){
$trans[(int)$event["id"]] = (string)$event->eventdescription;
}
print_r($trans);
首先,您可以简单地循环所有eventdescription节点,然后在该循环中检查它们设置了什么属性值。。。然后只对这些节点做进一步的操作,如果它是您要查找的节点。到目前为止,这些琐碎的事情。。。当然,您也可以采用XPath方式,直接选择以正确语言开头的元素。对于XML,我有50%的时间使用字符串解析,因为1。现在你不能相信任何人。IT同事会因为糟糕的代码而诋毁你,而企业主会为你的工作代码付钱
$requestUrl = <<<XML
<data>
<eventlist>
<events>
<event id="123">
<eventdescription lang="de">description_de123</eventdescription>
<eventdescription lang="en">descrition_en123</eventdescription>
</event>
<event id="456">
<eventdescription lang="de">description_de456</eventdescription>
<eventdescription lang="en">descrition_en456</eventdescription>
</event>
</events>
</eventlist>
</data>
XML;
$responseXml = simplexml_load_string($requestUrl);
$lang = 'de';
$trans = [];
foreach($responseXml->xpath("//event[eventdescription[@lang='$lang']]") as $event){
$trans[(int)$event["id"]] = (string)$event->eventdescription;
}
print_r($trans);
Array
(
[123] => description_de123
[456] => description_de456
)