根据属性访问节点值


Access a node value according to the attribute

我在访问XML文件中的值时遇到问题。尤其是我无法提取法语文本。我总是从GermanText中得到价值。有人知道如何直接获取包含法语字符串的节点的值吗。

查阅网页,我发现了这个,但它只会导致错误

echo $STRUCTURE_ITEM->NAME[@lang="fr"]

如有任何帮助,我们将不胜感激。

这是我的代码

<?php
$myXMLData = '<?xml version="1.0" encoding="utf-8"?>
<CATALOG>
<CLASSIFICATION>
<STRUCTURE_ITEM> 
    <KEY>3605</KEY>  
    <NAME lang="de">GermanText1</NAME>  
    <NAME lang="fr">FrenchText1</NAME>  
    <PARENT_ID>worlds</PARENT_ID>  
    <SORT>0</SORT> 
  </STRUCTURE_ITEM>  
  <STRUCTURE_ITEM> 
    <KEY>3606</KEY>  
    <NAME lang="de">GermanText2</NAME>  
    <NAME lang="fr">FrenchText2</NAME>  
    <PARENT_ID>3605</PARENT_ID>  
    <SORT>0</SORT> 
</STRUCTURE_ITEM>
</CLASSIFICATION>
</CATALOG>';

$xml=simplexml_load_string($myXMLData);
foreach($xml->CLASSIFICATION->children() as $STRUCTURE_ITEM) { 
    echo $STRUCTURE_ITEM->KEY . ", "; 
    echo $STRUCTURE_ITEM->NAME . ", "; 
    echo $STRUCTURE_ITEM->NAME . ", "; // <---- The problem lies here
    echo $STRUCTURE_ITEM->PARENT_ID . "<br>"; 
} ;
?>

编辑

感谢您的宝贵意见。我试过

$category_name_fr = $xml->xpath('//STRUCTURE_ITEM/NAME[@lang="fr"]');

现在我得到了法语值,但我得到了一个包含所有可用法语文本的数组。(法语文本1,法语文本2)。但我只想要当前节点的值。

让我提出一种不同于xpath的方法:内部foreach循环将遍历所有<NAME>并检查lang属性:

$lang = "fr";
foreach ($xml->CLASSIFICATION->STRUCTURE_ITEM as $item) { 
    echo $item->KEY . ", "; 
    foreach ($item->NAME as $name) 
        if ($name['lang'] == $lang) echo $name . ", ";        
    echo $item->PARENT_ID . "<br />";
}

在行动中看到它:https://eval.in/303058

编辑:如果您的XML是一致的,意味着de总是第一个,fr总是第二个,只需执行:

$lang = 1; // 1 = fr, 0 = de
foreach ($xml->CLASSIFICATION->STRUCTURE_ITEM as $item) { 
    echo $item->KEY . ", "; 
    echo $item->NAME[$lang] . ", ";
    echo $item->PARENT_ID . "<br />";
}

请参阅以下操作:https://eval.in/303062

您的xpath公式如下所示:
1.从文档根开始,沿名为"后代或自身"的方向前进(快捷方式为//)
2.在此上下文中,按默认的"children"方向搜索(注意,该方向不会在/之后给出),并查找名为STRUCTURE_ITEM
的元素3.从更新的上下文(STRUCTURE_ITEM元素)中,xpath再次查找子元素,称为NAME
4.最后,所有符合ale的节点都通过附加测试进行了检查(放在[]中)。Test says-检查"attributes"方向是否有节点(shortcut@)。节点必须命名为"fr"。

因为多个节点适合,所以结果是串联的。如果您希望单独提取NAME元素,请尝试缩小初始上下文(不要从文档根[//]开始)。

@编辑:
这似乎很有帮助:XPath查询返回不同级别上的多个节点