我有一些外部服务生成的xml,如下所示:
<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>
我正在使用simplexml加载这个xml并循环遍历事件:
$responseXml = simplexml_load_file($requestUrl);
$lang = 'de';
foreach($responseXml->eventlist->events->children() as $event){
// get eventdescription
}
现在我想基于$lang
变量以正确的语言获取每个事件的事件描述的字符串/文本。因此,如果将其设置为de
,我希望所有描述都包含属性lang="de"
。
我试过
echo( $event->eventdescription[0]);
哪种方式有效(假设de
和en
总是处于相同的顺序),但使用var_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
节点的字符串?如果语言不总是处于相同的顺序,是否有更好的方法来选择语言?
答案 0 :(得分:1)
在其他地方回答,但使用XPATH:
$events = $responseXml->xpath('//data[eventlist[events[event[eventdescription[@lang="de"]]]]]');
答案 1 :(得分:0)
或使用你的循环:
$lang = 'de';
foreach($responseXml->eventlist->events->children() as $event){
$description = (string) current($event->xpath('eventdescription[@lang="'.$lang.'"]'));
}
答案 2 :(得分:0)
再次使用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);
...给出
Array
(
[123] => description_de123
[456] => description_de456
)