根据属性访问节点值

时间:2015-03-22 15:10:19

标签: php xml xml-parsing

我无法从XML文件中访问值。特别是我无法提取FrenchText。我总是得到的是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"]');

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

2 个答案:

答案 0 :(得分:1)

让我建议一种与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

答案 1 :(得分:0)

你的xpath公式是这样的:
1.从文档根目录开始,按照称为“后代或自我”的方向前进。 (快捷方式是//)
2.从这个背景下搜索“孩子们”&#39;默认的方向(通知,在/之后没有给出方向)并查找名为STRUCTURE_ITEM的元素 3.从更新的上下文(STRUCTURE_ITEM元素),xpath再次寻找子元素,称为NAME
4.最后,所有适合ale的节点都进行了额外的测试(放在[]中)。测试说 - 检查属性中是否有节点&#39;方向(捷径@)。节点必须命名为&#39; fr&#39;。

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

@edit:
这似乎有帮助:XPath query return multiple nodes on different levels