2

I'm using php to parse my xml file, all I want to be able to do is to get the element child value from the attribute:

  <question number="1">
    <type>Main</type>
  </question>

  <question number="2">
    <type>Secondary</type>
  </question>

Pseudo Code (doesn't work):

$xmlDoc = new DOMDocument(); 
$xmlDoc->load('questions.xml'); 

$searchNode = $xmlDoc->getElementsByAttribute("number"); 

foreach( $searchNode as $searchNode ) {
if ($searchnode == "1"){

$xmlType = $searchNode->getElementsByTagName( "Type" );
$valueType = $xmlType->item(0)->nodeValue;  
 echo $valueType; 

}else{
//Do nothing
}

}

1 Answer 1

4

Use DOMXPath::evaluate

$xp = new DOMXPath($xmlDoc);
echo $xp->evaluate('string(/questions/question[@number=1]/type)'); // Main

Note that you have to have a root node, so the above assumes there is a <questions> element. It is generally more efficient to use a direct path to the elements, but you can also query any <question> anywhere in the document with //question[… instead.

If you want to do that without XPath, you can do

foreach ($xmlDoc->getElementsByTagName('question') as $question) {
    if($question->getAttribute('number') === '1') {
        echo $question->getElementsByTagName('type')->item(0)->nodeValue;
        // or
        echo $question->childNodes->item(1)->nodeValue;
    }
}

Note that when using childNodes and not setting DOMDocument::preserveWhiteSpace to FALSE, any line breaks, tab stops and other whitespace will be parsed as DOMText Nodes, hence item(1) and not item(0) because the latter is a DOMText node

Sign up to request clarification or add additional context in comments.

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.