根据属性访问节点值
Access a node value according to the attribute
我无法访问 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"]');
现在我得到了法语值,但我得到了一个包含所有可用法语文本的数组。 (法语文本 1、法语文本 2)。但是我只想要当前节点的值。
您的 xpath 公式执行如下操作:
1. 从文档根目录开始,向 'descendant-or-self' 方向前进(快捷方式是 //)
2. 从此上下文搜索默认的 'children' 方向(注意,/ 之后未给出该方向)并查找名为 STRUCTURE_ITEM
的元素
3. 从更新的上下文(STRUCTURE_ITEM 元素),xpath 再次寻找子元素,称为 NAME
4. 最后,所有适合 ale 的节点都通过附加测试进行了检查(放在 [] 中)。测试说 - 检查 'attributes' 方向是否有节点(快捷键@)。节点必须命名为 'fr'。
因为多个节点适合,所以结果被串联起来。如果您希望单独提取 NAME 元素,请尝试缩小您的初始上下文(不要从文档根 [//] 开始)。
@编辑:
这似乎很有帮助:XPath query return multiple nodes on different levels
让我提出一种不同于 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
我无法访问 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"]');
现在我得到了法语值,但我得到了一个包含所有可用法语文本的数组。 (法语文本 1、法语文本 2)。但是我只想要当前节点的值。
您的 xpath 公式执行如下操作:
1. 从文档根目录开始,向 'descendant-or-self' 方向前进(快捷方式是 //)
2. 从此上下文搜索默认的 'children' 方向(注意,/ 之后未给出该方向)并查找名为 STRUCTURE_ITEM
的元素
3. 从更新的上下文(STRUCTURE_ITEM 元素),xpath 再次寻找子元素,称为 NAME
4. 最后,所有适合 ale 的节点都通过附加测试进行了检查(放在 [] 中)。测试说 - 检查 'attributes' 方向是否有节点(快捷键@)。节点必须命名为 'fr'。
因为多个节点适合,所以结果被串联起来。如果您希望单独提取 NAME 元素,请尝试缩小您的初始上下文(不要从文档根 [//] 开始)。
@编辑:
这似乎很有帮助:XPath query return multiple nodes on different levels
让我提出一种不同于 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