Chciałbym napisać implementację wczytywania xmla niezależną od samej zawartości pliku. Chodzi mi o to, że nawet jeśli ktoś pozmienia nazwy elementów w pliku, to tablica wciąż będzie wyglądać prawidłowo, czyli tak (oczywiście nazwy kluczy w takim wypadku miałyby być odpowiednio pozamieniane smile.gif ):

  1. <?php
  2.        [article1] => Array (
  3.                                 [title] => example title
  4.                                 [author1] => example author
  5.                                 [author2] => sec ex aut
  6.                                 [shortcontent] => cccccc  
  7.                                 [hascomments] => 1
  8.                                 )
  9.        [article2] => Array (
  10.                                 [title] => title
  11.                                 [author1] => author
  12.                                 [author2] => aut
  13.                                 [shortcontent] => aaaaaaaa
  14.                                 [hascomments] => 1
  15.                                 )
  16.      )
  17. ?>


Teraz robię to taką funkcją, ale nie spełnia ona tego wymogu:

  1. <?php
  2. public function readArticlesList($category, $limitStart, $limitEnd)
  3. {
  4.  $array = array();
  5.  
  6.  $articleElement = null;
  7.  $name = null;
  8.  $dbObject = $this -> _dbObject;
  9.            
  10.  if(!$this -> _dbObject -> open($this -> _xmlFilePath.$category.'xml'))
  11.      throw new XMLSectionException('Nie można odczytać bazy danych');            
  12.            
  13.  $this -> _dbObject -> setParserProperty(XMLReader::LOADDTD, true);
  14.  
  15.  while($dbObject -> read())
  16.  {
  17.      if($dbObject -> nodeType == XMLReader::ELEMENT && $dbObject -> localName == 'article')
  18.          $articleElement = $dbObject -> localName.$dbObject -> getAttribute('id');
  19.                    
  20.      if($dbObject -> nodeType == XMLReader::ELEMENT)
  21.          $name = ($dbObject -> hasAttributes) ? $dbObject -> localName.$dbObject -> getAttribute('id') : $dbObject -> localName;    
  22.  
  23.      if($dbObject -> nodeType == XMLReader::TEXT || $dbObject -> nodeType == XMLReader::CDATA)
  24.          $array[$articleElement][$name] = $dbObject -> value;
  25.  }
  26.                  
  27.  $this -> _articleArray = array_slice($array, $limitStart, $limitEnd, true);
  28.      
  29.  return $this -> _articleArray;
  30. }
  31. ?>


Macie jakieś propozycje jak zastąpić ten fragment:
  1. <?php
  2. if($dbObject -> nodeType == XMLReader::ELEMENT && $dbObject -> localName == 'article')
  3.     $articleElement = $dbObject -> localName.$dbObject -> getAttribute('id');
  4. ?>


tak, żebym nie musiał sprawdzać localName i getAttribute? W simplexml jest coś takiego jak children(), która sprawdza, czy węzeł ma dzieci, natomiast używając xmlreadera nie bardzo mam pomysł jak to emulować. Coś takiego jest w ogóle możliwe używając klasy xmlreader, czy jestem skazany na pisanie "na sztywno"?