dongnai5905
dongnai5905
2010-11-17 12:04

XML - 使用php从属性中获取元素子值

已采纳

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条回答

  • dongzi1209 dongzi1209 11年前

    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

    点赞 评论 复制链接分享

相关推荐