doufei7516 2016-06-08 21:57
浏览 59
已采纳

php根据其他节点值从xml获取节点值

I have currently an xml file that is formatted as follows:

    <SKUQuestions>
       <SKUQuestion>
          <Tag>FrontCamaraWorks</Tag>
          <Question>Does the front Camera Work?</Question>
          <Answer>Yes</Answer>
       </SKUQuestion>
       <SKUQuestion>
          <Tag>BackCamaraWorks</Tag>
          <Question>Does the Rear Camera Work?</Question>
          <Answer>No</Answer>
       </SKUQuestion>
    </SKUQuestions>

I am currently getting the info from the "answer" nodes by calling where it occurs in the xml for example:

    $qFrontCameraWorks = $data['skuQuestions']->SKUQuestion[4];
    $data['frontCameraWorks'] = str_replace("'", "\'", $qFrontCameraWorks->Answer);

my problem is the xml files don't always come to me with the questions in the same order.

So, I was wanting to figure a way to query within a "SKUquestion" node if the "tag" is one thing then it would return the value of the "answer" node within that same SKUquestion node.

for example if the tag is "FrontCamaraWorks" then $data['frontCameraWorks'] is yes.

  • 写回答

2条回答 默认 最新

  • dongqin5604 2016-06-09 00:21
    关注

    Simply run an XPath query expression. As information, XPath is a declarative language used to reference parts of XML documents. PHP's SimpleXMLElement class can run XPath queries returned in arrays:

    $xmlstr = "<SKUQuestions>
                    <SKUQuestion>
                       <Tag>FrontCamaraWorks</Tag>
                       <Question>Does the front Camera Work?</Question>
                       <Answer>Yes</Answer>
                    </SKUQuestion>
                    <SKUQuestion>
                       <Tag>BackCamaraWorks</Tag>
                       <Question>Does the Rear Camera Work?</Question>
                       <Answer>No</Answer>
                    </SKUQuestion>
                </SKUQuestions>";
    
    # LOAD STRING XML
    $xml = new SimpleXMLElement($xmlstr);
    
    # RUN XPATH QUERY
    $queryResult = $xml->xpath('//SKUQuestion[Tag="FrontCamaraWorks"]/Answer');
    
    # OUTPUT VALUE
    echo $queryResult[0];
    # Yes
    

    Alternatively, you can use PHP's DOMXPath using its query() method which returns a DOMNodelist (not array):

    # LOAD STRING XML
    $xmldoc = new DOMDocument();
    $xmldoc->loadXML($xmlstr);
    
    # INITIALIZE AND RUN QUERY
    $xpathvar = new DOMXPath($xmldoc);    
    $queryResult = $xpathvar->query('//SKUQuestion[Tag="FrontCamaraWorks"]/Answer');
    
    # ITERATE DOM NODE LIST
    foreach($queryResult as $result){
        echo $result->nodeValue;
    }
    # Yes
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题