Php 如何使用simplexml通过属性值获取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

我有一些由外部服务生成的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>
现在,我想基于
$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
)