使用xpath和php获取子元素[关闭]

I have this sample xml file:-

<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>

I am trying to get tab_id child element using XPathand I want result in set of child elements.

My expected output is as follows:-

dist_region,dist_region,dist_region

MY XPATH:-

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

Can anyone suggest what is the XPath to get child elements? Thanks.

douyiyang6317
douyiyang6317 是什么让这个问题与你以前的问题有所不同?如何使用phpxpath获取所有属性
7 年多之前 回复
douxiong5972
douxiong5972 你的xpath有什么问题?给那些孩子看起来很好。你有什么问题??
7 年多之前 回复
doufud21086
doufud21086 你给我一个建议还是你尝试过XPath?
7 年多之前 回复
dtxox60220
dtxox60220 试试这个xpath$tab=$product->xpath('//tab_id/*');
7 年多之前 回复
du9698
du9698 你能展示你的代码吗?
7 年多之前 回复

2个回答

Your XPath should be based on specific condition like value (if it is <tab_id id='256'> then more readable)

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

and then loop through it like below

if($result->length){
    foreach ($result as $item):
        echo "Value: ".$item['value'];
    echo "<hr>";
endforeach;
}
douzhan1868
douzhan1868 是。 当然。
7 年多之前 回复
doufan9377
doufan9377 即便如此,这已经在本网站上得到了很大的回答。 用超链接引用答案而不是添加另一个 - 特别是因为不清楚OP要求的是什么。
7 年多之前 回复
dougudu3564
dougudu3564 实际上有这样的XML文件,其中提供了ID,用户希望根据条件获取特定节点。 所以就这么想。 但我相信下次会记住你的建议。 :)这是一个例子。
7 年多之前 回复
douhuxi4145
douhuxi4145 也许有人想要处理更多节点? 这没什么不对的。 您的解决方案不是通用的,实际上非常具体。 我对此很挑剔,因为那些具有很少XML / XPath知识(可能是SQL背景)的人可能会在阅读你的答案之后想到你确实应该在XML中使用某种id,这绝对不是真的。
7 年多之前 回复
doufu1950
doufu1950 我感谢您的反馈,但我指定了通用解决方案,请记住,如果有更多的节点,并且必须根据条件选择特定的节点。 虽然不是问题。
7 年多之前 回复
dongzhina7098
dongzhina7098 当然,但没有人要求获得特定的tab_id元素。 恰恰相反,在输入示例中只有一个tab_id,因此不需要id。 如果有多个tab_id,则可能会有一个处理所有tab_id。 或许还有一些其他条件。 你正在做出任何地方都没有给出的假设。 你不需要id,这不是SQL。
7 年多之前 回复
duanbaque4230
duanbaque4230 <tab_id value =“251”>获取特定的tab_id(如果还有更多),那么我们就可以得到它。 假设$ id将被所需的值初始化。
7 年多之前 回复
duanhan3067
duanhan3067 为什么必须有像@ value ='这样的条件。 $ id。 “? 完全没有理由,您不需要XML中的ID
7 年多之前 回复

The xpath you tried works for me. So, Try the next code:

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

$array = array();

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

echo implode(',',$array);

It gives you your desire output: dist_region,dist_region,dist_region.

Been $xml your XML file.

dongzhi4498
dongzhi4498 那回答是否有用呢?
7 年多之前 回复
dongpian4954
dongpian4954 如果要获取value属性,请使用建议的xpath hakre:'// tab_id / * / @ value'。 在每个内部只需将$ child附加到$ array。 $ array [] = $ child;
7 年多之前 回复
douxian9010
douxian9010 并使用此函数attributes();
7 年多之前 回复
dpysrta21239
dpysrta21239 如果我想要所有属性然后我做什么? 我试试这个... $ tab = $ product-> xpath('// tab_id / ancestor :: product_id / descendant-or-self :: * / @ *');
7 年多之前 回复
drpqxogph15436713
drpqxogph15436713 谢谢@hakre。 我不知道:)
7 年多之前 回复
doucuan5365
doucuan5365 我稍微编辑了你的答案:你不需要将数组转换为数组; (另外)你不应该把任何东西投射到你预告的数组上(这在PHP中是不好的做法); getName()具有元素的实际名称 - 而不是value属性。 如果要选择所有值属性作为数组:echo implode(',',$ sxml-> xpath('// tab_id / * / @ value')); - :-)
7 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐