[PHP] Как добавить запись в XML?

Discussion in 'PHP' started by z00m, 15 Oct 2010.

  1. z00m

    z00m New Member

    Joined:
    1 Jun 2010
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Имеется XML вида:
    Code:
    <?xml version="1.0" encoding="UTF-8" ?>
    <xml>
     <item>
      <title>Item1</title>
      <text>Text of Item1</text>
     </item>
     <item>
      <title>Item2</title>
      <text>Text of Item2</text>
     </item>
     <item>
      <title>Item3</title>
      <text>Text of Item3</text>
     </item>
    </xml> 
    Для добавления записей использую SimpleXML (через addChild). Все замечательно, но он пишет новый item в конец.

    Подскажите плз, как сделать, что бы новый добавленный item был первым, т.е. записывался в начало документа?
    Я так понимаю это возможно средствами DOM? Подскажите, как это проще реализовать?
     
  2. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Так попробуйте
    PHP:
    <?php
      $sxml 
    simplexml_load_file ('92.xml');
      
    $xml_str $sxml->asXML ();
      
    $dom = new DOMDocument;
      
    //$dom->formatOutput = true;
      
    $dom->loadXML ($xml_str);
      
    $xpath = new DOMXPath ($dom);
      
    $parent $xpath->query ('//xml');
      
    $next $xpath->query ('//xml/item');
      
    $new_item $dom->createElement ('item');
      
    $new_title $dom->createElement ('title''Item0');
      
    $new_text $dom->createElement ('text''Text of Item0');
      
    $new_item->appendChild ($new_title);
      
    $new_item->appendChild ($new_text);
      
    $parent->item(0)->insertBefore ($new_item$next->item (0));
      echo 
    $dom->saveXML ();
    ?>
     
  3. z00m

    z00m New Member

    Joined:
    1 Jun 2010
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Code:
    PHP Fatal error:  Call to a member function insertBefore() on a non-object
    =(
     
  4. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Какая у вас версия PHP? Попробуйте такой вариант (без XPath)
    PHP:
    <?php
      $sxml 
    simplexml_load_file ('92.xml');
      
    $xml_str $sxml->asXML ();
      
    $dom = new DOMDocument;
      
    //$dom->formatOutput = true;
      
    $dom->loadXML ($xml_str);
      
    $parent $dom->documentElement;
      
    $first_item $parent->getElementsByTagname('item')->item (0);
      
      
    $new_item $dom->createElement ('item');
      
    $new_title $dom->createElement ('title''Item0');
      
    $new_text $dom->createElement ('text''Text of Item0');
      
    $new_item->appendChild ($new_title);
      
    $new_item->appendChild ($new_text);
      
      
    $parent->insertBefore ($new_item$first_item);
      
      echo 
    $dom->saveXML ();
    ?>
    У меня оба варианта работают (5.2.9). Вывод:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xml>
      <item><title>Item0</title><text>Text of Item0</text></item><item>
        <title>Item1</title>
        <text>Text of Item1</text>
      </item>
      <item>
        <title>Item2</title>
        <text>Text of Item2</text>
      </item>
      <item>
        <title>Item3</title>
        <text>Text of Item3</text>
      </item>
    </xml>
    
     
    #4 krypt3r, 19 Oct 2010
    Last edited: 19 Oct 2010
  5. z00m

    z00m New Member

    Joined:
    1 Jun 2010
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Вернулся к старому делу...

    Версия пхп - 5.2.11.
    Со вторым вариантом вообще ничего не происходит.

    При добавлении стандартными средствами ХМЛ все нормально. С ДОМом никак не могу разобраться...

    Code:
    	//Загружаем XML-файл
    	$xml = simplexml_load_file('news.xml');
    	
    	//Добавляем данные в XML
    	$item = $xml->channel->addChild('item');
    	$item->addChild('date', $pubDate);
    	$item->addChild('title', $subject);
    	$item->addChild('description', $content);
    	
    	//сохраняем файл
    	$xml->asXML('news.xml');
    
     
  6. z00m

    z00m New Member

    Joined:
    1 Jun 2010
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Все, разобрался...
    PHP:
    <?php
        $dom 
    = new DomDocument();
        
    $dom->load("news.xml");
        
        
    $xpath = new DOMXPath ($dom);
        
    $parent $xpath->query ('//xml');
        
    $next $xpath->query ('//xml/item');
        
    $new_item $dom->createElement ('item');
        
    $new_title $dom->createElement ('title''Item0');
        
    $new_text $dom->createElement ('description''Text of Item0');
        
    $new_item->appendChild ($new_title);
        
    $new_item->appendChild ($new_text);
        
    $parent->item(0)->insertBefore($new_item$next->item(0));
        
        
    $dom->save("news.xml");
    ?>
     
  7. z00m

    z00m New Member

    Joined:
    1 Jun 2010
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Еще такой вопрос... Можно ли добавить форматирование в сам ХМЛ-файл, что б новые записи не добавлялись все в одну строку?
     
  8. Dipp

    Dipp New Member

    Joined:
    3 Mar 2010
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    думаю можно=)
     
  9. z00m

    z00m New Member

    Joined:
    1 Jun 2010
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Dipp, думать мы все умеем)

    Меня интересует, как это проще реализовать через тот же DOM. Или может есть другие способы.