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
    
    点赞 评论
  • doubi9999 2016-06-08 23:34

    You can refer this link for the details: http://php.net/manual/en/function.simplexml-load-file.php.

    I am giving you an example also for your understanding.
    Convert the XML string ($buffer) into a simplified array ignore attributes and grouping child-elements with the same names:

        function XML2Array(SimpleXMLElement $parent)
    {
        $array = array();
    
        foreach ($parent as $name => $element) {
            ($node = & $array[$name])
                && (1 === count($node) ? $node = array($node) : 1)
                && $node = & $node[];
    
            $node = $element->count() ? XML2Array($element) : trim($element);
        }
    
        return $array;
    }
    
    $xml   = simplexml_load_string($buffer);
    $array = XML2Array($xml);
    $array = array($xml->getName() => $array);
    
    Result:
    
    Array
    (
        [SKUQuestions] => Array
            (
                [SKUQuestion] => Array
                    (
                            [Tag] => 
                            [Question] => 
                            [Answer] => 
    
                    )
    
            )
    
    )
    


    Then, you can refer the answer tag irrespective of your skuquestions ordering. I hope it will help.

    点赞 评论

相关推荐 更多相似问题