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

时间:2017-08-21 11:08:54

标签: php xml simplexml

我有一些外部服务生成的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节点的字符串?如果语言不总是处于相同的顺序,是否有更好的方法来选择语言?

3 个答案:

答案 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
)