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 笔记本上移动热点开关状态查询
  • ¥85 类鸟群Boids——仿真鸟群避障的相关问题
  • ¥15 CFEDEM自带算例错误,如何解决?
  • ¥15 有没有会使用flac3d软件的家人
  • ¥20 360摄像头无法解绑使用,请教解绑当前账号绑定问题,
  • ¥15 docker实践项目
  • ¥15 利用pthon计算薄膜结构的光导纳
  • ¥15 海康hlss视频流怎么播放
  • ¥15 Paddleocr:out of memory error on GPU
  • ¥30 51单片机C语言数码管驱动单片机为AT89C52