如何使用 simplexml 按属性值获取 xml 节点值?



>我有一些由外部服务生成的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]);

哪种工作(假设deen总是以相同的顺序(,但使用 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节点的字符串呢?如果语言并不总是以相同的顺序进行语言选择,是否有更好的方法?

在其他地方回答,但使用 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);

给。。。

Array
(
[123] => description_de123
[456] => description_de456
)

最新更新