1

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

1

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
Sign up to request clarification or add additional context in comments.

2 Comments

This is the answer. Thanks so much.
Great! Glad I could help. Please accept to confirm resolution.
0

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.