XML - получение дочернего значения элемента из атрибута с использованием php - PullRequest
2 голосов
/ 17 ноября 2010

Я использую php для разбора моего xml-файла, все, что я хочу, это получить дочернее значение элемента из атрибута:

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

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

Псевдокод (не работает):

$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 Ответ

4 голосов
/ 17 ноября 2010

Использование DOMXPath::evaluate

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

Обратите внимание, что у вас должен быть корневой узел, поэтому в приведенном выше примере предполагается, что существует элемент <questions>. Как правило, более эффективно использовать прямой путь к элементам, но вы также можете запросить любой <question> в любом месте документа с помощью //question[….

Если вы хотите сделать это без XPath, вы можете сделать

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;
    }
}

Обратите внимание, что при использовании childNodes и без установки DOMDocument::preserveWhiteSpace на FALSE любые разрывы строк, табуляции и другие пробелы будут анализироваться как DOMText узлов, следовательно, item(1), а не item(0), поскольку последний является DOMText узлом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...