За последние 24 часа нас посетили 17679 программистов и 1611 роботов. Сейчас ищут 2075 программистов ...

нужна подсказка по xmlwriter

Тема в разделе "PHP для новичков", создана пользователем ramko, 11 авг 2013.

  1. ramko

    ramko Новичок

    С нами с:
    11 авг 2013
    Сообщения:
    10
    Симпатии:
    0
    Добрый день, коллеги.

    Есть следующий код
    Код (Text):
    1.  
    2. <?              $xml->startElement("CONTENT");
    3.                    
    4.                     foreach ($array as $code=>$cnt) {
    5.                        
    6.                         $xml->startElement("CODE");
    7.                             $xml->startAttribute('CODE_ID');
    8.                                 $xml->text($code);
    9.                             $xml->endAttribute();
    10.                             $xml->writeElement("CNT",$cnt);
    11.                             $xml->writeElement("UNIT_TYP","шт");
    12.                             $xml->writeElement("NOM_TYP",1);
    13.                             $xml->writeElement("PRICE",980);
    14.                         $xml->endElement("CODE");
    15.  
    16.                     }
    17.                    
    18.                 $xml->endElement("CONTENT");
    19. ?>
    работает он не совсем верно... вот как он формирует xml
    Код (Text):
    1.  
    2. <CODE CODE_ID="4640001716850">
    3.    <CNT>1</CNT>
    4.    <UNIT_TYP>шт</UNIT_TYP>
    5.    <NOM_TYP>1</NOM_TYP>
    6.    <PRICE>980</PRICE>
    7. <CODE CODE_ID="4610007432870">
    8.    <CNT>2</CNT>
    9. <UNIT_TYP>шт</UNIT_TYP>
    10.    <NOM_TYP>1</NOM_TYP>
    11.    <PRICE>980</PRICE>
    12. <CODE CODE_ID="0075380010505">
    13.    <CNT>1</CNT>
    14.    <UNIT_TYP>шт</UNIT_TYP>
    15.    <NOM_TYP>1</NOM_TYP>
    16.    <PRICE>980</PRICE>
    17. </CODE>
    18. </CODE>
    19. </CODE>
    обратите внимание на три последних закрывающих тега CODE.

    Что я делаю не так?
     
  2. Avivar

    Avivar Новичок

    С нами с:
    6 авг 2013
    Сообщения:
    15
    Симпатии:
    0
    Вот так правильнее будет

    Код (Text):
    1. <?            $xml->startElement("CONTENT");
    2.                
    3.                foreach ($array as $code=>$cnt)   {
    4.                  
    5.                   $xml->startElement("CODE");
    6.                      $xml->startAttribute('CODE_ID');
    7.                         $xml->text($code);
    8.                      $xml->endAttribute();
    9.                      $xml->writeElement("CNT",$cnt);
    10.                      $xml->writeElement("UNIT_TYP","шт");
    11.                      $xml->writeElement("NOM_TYP",1);
    12.                      $xml->writeElement("PRICE",980);
    13.                   $xml->endElement();
    14.  
    15.                }
    16.                
    17.             $xml->endElement();
    18. ?>
    и можно сразу записывать атрибут
    Код (Text):
    1. $xml->writeAttribute('CODE_ID',$code);
    вместо этого
    Код (Text):
    1. $xml->startAttribute('CODE_ID');
    2.                         $xml->text($code);
    3.                      $xml->endAttribute();
     
  3. ramko

    ramko Новичок

    С нами с:
    11 авг 2013
    Сообщения:
    10
    Симпатии:
    0
    За вот этот код
    Код (Text):
    1. $xml->writeAttribute('CODE_ID',$code);
    спасибо, работает.

    Но проблема с тремя закрывающими тегами не решилась... почему то закрываются все за раз....
     
  4. Avivar

    Avivar Новичок

    С нами с:
    6 авг 2013
    Сообщения:
    15
    Симпатии:
    0
    Хм... вот скопировал ваш код, справкой $xml->endElement() (подчеркиваю скобки пустые должны быть). и Он работает. Ниже код и результат..
    Код (Text):
    1. $xml = new XMLWriter();
    2. $xml->openMemory();
    3. $xml->startDocument('1.0', 'UTF-8');
    4. $xml->startElement("CONTENT");
    5.                 for($i=0;$i<=3;$i++)   {
    6.                   $xml->startElement("CODE");
    7.                      $xml->writeAttribute('CODE_ID',time());
    8.                       $xml->writeElement("CNT",$i);
    9.                      $xml->writeElement("UNIT_TYP","шт");
    10.                      $xml->writeElement("NOM_TYP",1);
    11.                      $xml->writeElement("PRICE",980);
    12.                   $xml->endElement();
    13.                }
    14.               $xml->endElement();
    15. file_put_contents('example.xml', $xml->flush(true), FILE_APPEND);
    Результат:
    Код (Text):
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <CONTENT>
    3. <CODE CODE_ID="1376250172">
    4.     <CNT>0</CNT>
    5.     <UNIT_TYP>шт</UNIT_TYP>
    6.     <NOM_TYP>1</NOM_TYP>
    7.     <PRICE>980</PRICE>
    8. </CODE>
    9. <CODE CODE_ID="1376250172">
    10.     <CNT>1</CNT>
    11.     <UNIT_TYP>шт</UNIT_TYP>
    12.     <NOM_TYP>1</NOM_TYP>
    13.     <PRICE>980</PRICE>
    14. </CODE>
    15. <CODE CODE_ID="1376250172">
    16.     <CNT>2</CNT>
    17.     <UNIT_TYP>шт</UNIT_TYP>
    18.     <NOM_TYP>1</NOM_TYP>
    19.     <PRICE>980</PRICE>
    20. </CODE>
    21. <CODE CODE_ID="1376250172">
    22.     <CNT>3</CNT>
    23.     <UNIT_TYP>шт</UNIT_TYP>
    24.     <NOM_TYP>1</NOM_TYP>
    25.     <PRICE>980</PRICE>
    26. </CODE>
    27. </CONTENT>
     
  5. ramko

    ramko Новичок

    С нами с:
    11 авг 2013
    Сообщения:
    10
    Симпатии:
    0
    Приведу больший кусок кода...
    Код (Text):
    1.  
    2. $file = fopen($path_xml.$filename,"wt");
    3.  
    4.   $xml = new XMLWriter();
    5.     $xml->openMemory();
    6.     $xml->startDocument('1.0' , 'Windows-1251');
    7.         $xml->startElement("DOC");
    8.             $xml->startElement("DOC_OUT");
    9.                 $xml->writeElement("NUMBER",$num);
    10.                 $xml->writeElement("ID_DOC",$num);
    11.                 $xml->writeElement("DATE","08.07.2013");
    12.                 $xml->writeElement("DELIVERY_DATE",$delivery_date);
    13.                 $xml->writeElement("SHIPMENT_DATE",$delivery_date);
    14.                 $xml->writeElement("DESTINATION",$destination);
    15.                 $xml->writeElement("CUSTOMER",$customer);
    16.                 $xml->writeElement("CUSTOMER_ID",223975);
    17.                 $xml->writeElement("TYPE",1);
    18.                 $xml->startElement("CONTENT");
    19.                    
    20.                     foreach ($array as $code=>$cnt) {
    21.                        
    22.                         $xml->startElement("CODE");
    23.                             $xml->writeAttribute('CODE_ID',$code);
    24.                             $xml->writeElement("CNT",$cnt);
    25.                             $xml->writeElement("UNIT_TYP","шт");
    26.                             $xml->writeElement("NOM_TYP",1);
    27.                             $xml->writeElement("PRICE",980);
    28.                         $xml->endElement("");
    29.  
    30.                     }
    31.                    
    32.                 $xml->endElement("");
    33.             $xml->endElement("");
    34.         $xml->endElement("");
    35.     $xml->endDocument();
    36.    
    37.     $result = $xml->outputMemory();
    38.     echo $result;
    39.     fwrite ($file, $result);
    40.  
    41. fclose($file);
    Генерируется по прежнему.
     
  6. kosinus2012

    kosinus2012 Активный пользователь

    С нами с:
    16 июл 2012
    Сообщения:
    137
    Симпатии:
    0
    И что вам выдает при работе?
     
  7. ramko

    ramko Новичок

    С нами с:
    11 авг 2013
    Сообщения:
    10
    Симпатии:
    0
    Код (Text):
    1.  
    2. <?xml version="1.0" encoding="WINDOWS-1251"?>
    3. <DOC>
    4. <DOC_OUT>
    5. <NUMBER>302</NUMBER>
    6. <ID_DOC>302</ID_DOC>
    7. <DATE>08.07.2013</DATE>
    8. <DELIVERY_DATE>13.08.2013 00:35:23</DELIVERY_DATE>
    9. <SHIPMENT_DATE>13.08.2013 00:35:23</SHIPMENT_DATE>
    10. <DESTINATION>Москва, Ленина 45</DESTINATION>
    11. <CUSTOMER>Марина Заславская</CUSTOMER>
    12. <CUSTOMER_ID>223975</CUSTOMER_ID>
    13. <TYPE>1</TYPE>
    14. <CONTENT>
    15. <CODE CODE_ID="4640001716850">
    16.   <CNT>1</CNT>
    17.   <UNIT_TYP>шт</UNIT_TYP>
    18.   <NOM_TYP>1</NOM_TYP>
    19.   <PRICE>980</PRICE>
    20. <CODE CODE_ID="4610007432870">
    21.   <CNT>2</CNT>
    22.   <UNIT_TYP>шт</UNIT_TYP>
    23.   <NOM_TYP>1</NOM_TYP>
    24.   <PRICE>980</PRICE>
    25. <CODE CODE_ID="0075380010505">
    26.   <CNT>1</CNT>
    27.   <UNIT_TYP>шт</UNIT_TYP>
    28.   <NOM_TYP>1</NOM_TYP>
    29.   <PRICE>980</PRICE>
    30. </CODE>
    31. </CODE>
    32. </CODE>
    33. </CONTENT>
    34. </DOC_OUT>
    35. </DOC>
     
  8. kosinus2012

    kosinus2012 Активный пользователь

    С нами с:
    16 июл 2012
    Сообщения:
    137
    Симпатии:
    0
    Замените
    Код (Text):
    1. $xml->startDocument('1.0' , 'Windows-1251');
    на
    Код (Text):
    1. $xml->startDocument('1.0' , 'UTF-8');
     
  9. ramko

    ramko Новичок

    С нами с:
    11 авг 2013
    Сообщения:
    10
    Симпатии:
    0

    Не помогло (
     
  10. kosinus2012

    kosinus2012 Активный пользователь

    С нами с:
    16 июл 2012
    Сообщения:
    137
    Симпатии:
    0
    Код (Text):
    1. $file = fopen('example.xml',"wt");
    2.  
    3. $array = array('4640001716850', '46400017168123');
    4.  
    5.   $xml = new XMLWriter();
    6.     $xml->openMemory();
    7.     $xml->startDocument('1.0' , 'UTF-8');
    8.    
    9.      $xml->startElement("DOC");
    10.          $xml->startElement("DOC_OUT");
    11.             $xml->writeElement("CUSTOMER_ID",223975);
    12.             $xml->writeElement("TYPE",1);
    13.        
    14.      $xml->startElement("CONTENT");
    15.            
    16.   foreach ($array as $code=>$cnt)   {
    17.    
    18.                   $xml->startElement("CODE");
    19.                      $xml->writeAttribute('CODE_ID',$code);
    20.                      $xml->writeElement("CNT",$cnt);
    21.                      $xml->writeElement("UNIT_TYP","шт");
    22.                      $xml->writeElement("NOM_TYP",1);
    23.                      $xml->writeElement("PRICE",980);
    24.                   $xml->endElement();
    25.              
    26. }
    27.             $xml->endElement();
    28.             $xml->endElement();
    29.         $xml->endElement();
    30.  
    31.  $xml->endDocument();
    32.    
    33. $result = $xml->outputMemory();
    34. echo $result;
    35. fwrite ($file, $result);
    36.  
    37. fclose($file);
    Результат:
    Код (Text):
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <DOC>
    3. <DOC_OUT>
    4. <CUSTOMER_ID>223975</CUSTOMER_ID>
    5. <TYPE>1</TYPE>
    6. <CONTENT>
    7. <CODE CODE_ID="0">
    8. <CNT>4640001716850</CNT>
    9. <UNIT_TYP>רע</UNIT_TYP>
    10. <NOM_TYP>1</NOM_TYP>
    11. <PRICE>980</PRICE>
    12. </CODE>
    13. <CODE CODE_ID="1">
    14. <CNT>46400017168123</CNT>
    15. <UNIT_TYP>רע</UNIT_TYP>
    16. <NOM_TYP>1</NOM_TYP>
    17. <PRICE>980</PRICE>
    18. </CODE>
    19. </CONTENT>
    20. </DOC_OUT>
    21. </DOC>
    Добавлено спустя 48 секунд:
    Работает на отлично!
     
  11. ramko

    ramko Новичок

    С нами с:
    11 авг 2013
    Сообщения:
    10
    Симпатии:
    0
    Не буду форматировать, вот вывод
    Код (Text):
    1.  
    2. <p>Function fl_out_order ()</p>Out_20130812-0042_n302_.xml<?xml version="1.0" encoding="UTF-8"?>
    3. <DOC><DOC_OUT><NUMBER>302</NUMBER><ID_DOC>302</ID_DOC><DATE>08.07.2013</DATE><DELIVERY_DATE>13.08.2013 00:42:57</DELIVERY_DATE><SHIPMENT_DATE>13.08.2013 00:42:57</SHIPMENT_DATE><DESTINATION>Москва, </DESTINATION><CUSTOMER>Марина Заславская</CUSTOMER><CUSTOMER_ID>223975</CUSTOMER_ID><TYPE>1</TYPE><CONTENT><CODE CODE_ID="4640001716850"><CNT>1</CNT><UNIT_TYP>шт</UNIT_TYP><NOM_TYP>1</NOM_TYP><PRICE>980</PRICE><CODE CODE_ID="4610007432870"><CNT>2</CNT><UNIT_TYP>шт</UNIT_TYP><NOM_TYP>1</NOM_TYP><PRICE>980</PRICE><CODE CODE_ID="0075380010505"><CNT>1</CNT><UNIT_TYP>шт</UNIT_TYP><NOM_TYP>1</NOM_TYP><PRICE>980</PRICE></CODE></CODE></CODE></CONTENT></DOC_OUT></DOC>
    4. <p>END</p>
    три тега все там же...

    Добавлено спустя 1 минуту 56 секунд:
    Буду копать...

    Добавлено спустя 21 минуту 9 секунд:
    Нашел...

    не до конца очистил
    Код (Text):
    1. $xml->endElement("");
    сделал
    Код (Text):
    1. $xml->endElement();
    и заработало.


    Спасибо за отклик.