【问题标题】:get child element using xpath and php [closed]使用 xpath 和 php 获取子元素 [关闭]
【发布时间】:2013-05-15 00:43:42
【问题描述】:

我有这个示例 xml 文件:-

<products>
   <product_id value="1">
       <tab_id value="251">
            <dist_region value="5" />
            <dist_region value="10066" />
            <dist_region value="10069" />
       </tab_id>
   </product_id>
</products>

我正在尝试使用 XPath 获取 tab_id 子元素,并且我希望得到一组子元素。

我的预期输出如下:-

dist_region,dist_region,dist_region

我的 XPATH:-

$tab = $product->xpath('//tab_id/*');

谁能建议XPath 是什么来获取子元素? 谢谢。

【问题讨论】:

  • 你能展示你的代码吗?
  • @NullVoid jsut 试试这个 xpath $tab = $product-&gt;xpath('//tab_id/*');
  • 您是给我建议还是尝试过 XPath?
  • 你的 xpath 有什么问题?给那些孩子看起来不错。你有什么问题??
  • 这个问题与您之前的问题有何不同? how to get all attribute using php xpath

标签: php xml xpath


【解决方案1】:

您尝试的 xpath 对我有用。所以,试试下面的代码:

$sxml = new SimpleXMLElement($xml);
$xpath = $sxml->xpath('//tab_id/*');

$array = array();

foreach ($xpath as $child)
{
    $array[] = $child->getName();
}

echo implode(',',$array);

它给你你想要的输出:dist_region,dist_region,dist_region。

$xml您的 XML 文件。

【讨论】:

  • 我稍微编辑了您的答案:您不需要将数组转换为数组; (另外)你不应该将任何东西投射到你 foreach 的数组中(这在 PHP 中是不好的做法); getName() 具有元素的实际名称 - 而不是 value 属性。 如果你想选择所有值属性作为数组:echo implode(',', $sxml-&gt;xpath('//tab_id/*/@value')); - :-)
  • 谢谢@hakre。我不知道:)
  • @LuigiSiri 如果我想要所有属性,那么我该怎么做?我试试这个...$tab = $product-&gt;xpath('//tab_id/ancestor::product_id/descendant-or-self::*/@*');
  • 并使用这个函数attributes();
  • 如果要获取value属性,建议使用xpath hakre:'//tab_id/*/@value'。在 for each 中,只需将 $child 附加到 $array。 $array[] = $child;
【解决方案2】:

您的XPath 应基于特定条件,例如value(如果是&lt;tab_id id='256'&gt;,则更具可读性)

$result = $product->query('//tab_id[@value=' . $id . ']/*');

然后像下面这样循环遍历它

if($result->length){
    foreach ($result as $item):
        echo "Value: ".$item['value'];
    echo "<hr>";
endforeach;
}

【讨论】:

  • 为什么一定要有@value=' . $id . '这样的条件?完全没有理由,您不需要 XML 中的 ID
  • &lt;tab_id value="251"&gt; 得到一个特定的tab_id(如果有更多)那么我们就可以得到它。 $id 假定它将被一个所需的值初始化。
  • 当然,但没有人要求获得特定的tab_id 元素。恰恰相反,因为在输入示例中只有一个tab_id,因此没有必要使用 id。如果有多个tab_ids,也许一个会处理所有这些。或者也许还有其他一些条件。您正在做出任何地方都没有给出的假设。你不需要 id,这不是 SQL。
  • @dirkk 感谢您的反馈,但我指定了通用解决方案以记住是否有更多节点并且必须根据条件选择特定的解决方案。虽然不是问题。
  • 实际上有这样的XML文件,其中提供了ids,用户希望根据条件获取特定的节点。于是就这么想了。但我下次一定会记住你的建议。 :) Here 就是一个例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 2017-05-07
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多