Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: XML-русские параметры
Форумы портала PHP.SU » » XML и его обработка » XML-русские параметры

Страниц (1): [1]
 

1. I_CaR - 06 Августа, 2012 - 08:46:36 - перейти к сообщению
Доброго всем здравия.
Вот возникла необходимость заносить в БД данные вытягивая их из XML.
взялся пробовать с простого.
пример XML:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <messages>
  4.  <info id="10">
  5.  <name>имя</name>
  6.  <text>текст</text>
  7.  </info>
  8. </messages>
  9.  


Тут всё понятно.
Далее PHP-обработчик
PHP:
скопировать код в буфер обмена
  1.  
  2.  header('Content-type: text/html; charset=utf-8');
  3.  $xml = simplexml_load_file('XML/data.xml');
  4.  foreach ($xml->info as $info)
  5.  {
  6.  print ("id=");
  7.  print ($info[id]);
  8.  print ("<br>");
  9.  print ("name=");
  10.  print ($info->name);
  11.  print ("<br>");
  12.  print ("text=");
  13.  print ($info->text);
  14.  print ("<hr>");
  15.  
  16.  }
  17.  


Но это пример, а в реальности пришлось увидеть XML-файл (родом из 1С) с название элементов на русском. Пример:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <КоммерческаяИнформация>
  3.         <Каталог Идентификатор="XXXXXXX" Наименование="Тузики" Владелец="yyyyyy" Единица="шт">
  4.                 <Свойство Идентификатор="Комментарий" Наименование="Дополнительная информация"/>
  5.                 <Свойство Идентификатор="ПолноеНаименование" Наименование="Полное наименование"/>
  6.                
  7.                 <Товар Идентификатор="aaaaaa" ИдентификаторВКаталоге="aaaaaa" Наименование="Тузик с хвостом" Родитель="bbbbbb" Единица="шт">
  8.                 <ЗначениеСвойства ИдентификаторКаталога="cccccc" ИдентификаторСвойства="ПолноеНаименование" Значение="Тузик с хвостом"/>
  9.                 </Товар>
  10.                
  11.                 <Группа Идентификатор="внук" ИдентификаторВКаталоге="внук" Наименование="Собаки" Родитель="сын"/>
  12.                 <Группа Идентификатор="сын" ИдентификаторВКаталоге="сын" Наименование="Тузики" Родитель="родитель"/>
  13.                 <Группа Идентификатор="родитель" ИдентификаторВКаталоге="родитель" Наименование="без документов"/>
  14.         </Каталог>
  15. </КоммерческаяИнформация>
  16.  


Как в таком случае получить данные из XML. Подскажите, как начать.
2. Panoptik - 06 Августа, 2012 - 08:53:21 - перейти к сообщению
foreach попробуйте
3. I_CaR - 06 Августа, 2012 - 09:36:51 - перейти к сообщению
Panoptik пишет:
foreach попробуйте

А в моём примере разве
CODE (htmlphp):
скопировать код в буфер обмена
  1. foreach ($xml->info as $info)
это не то?

В первом примере вывод:
print ($info[id]);

А как во втором это реализовать?
ведь:
print ($Каталог Идентификатор->Свойство Идентификатор);
Как эти названия параметров на кириллице, преобразовать в латинские?
Или я вообще не в том направлении рою?
Уточню - файл стандарта CommerceML
4. LIME - 06 Августа, 2012 - 09:38:49 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. foreach ($xml as $info){
  2.     foreach ($info as $item){
  3.        // ....
  4.     }
  5. }
5. I_CaR - 06 Августа, 2012 - 11:07:09 - перейти к сообщению
С наименованиями параметров на латинском понятно.
C родителями и дочками тоже понятно (принимаются через foreach).
Я сделал, данные получаю.

Но вот, как тогда, быть с таким вот XML (и он именно на кириллице!):
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <информация>
  4.  
  5.  <каталог id="10">
  6.  <наименование>штучка</наименование>
  7.  <описание>очень нужная штучка</описание>
  8.  </каталог>
  9.  
  10. </информация>


Вот тут я стопорнулся, не могу ни как сообразить, как эти параметры принять в PHP.
6. Мелкий - 06 Августа, 2012 - 11:12:38 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. simplexml_load_string($xml)->{'каталог'}->{'описание'}

В общем-то, даже
PHP:
скопировать код в буфер обмена
  1. simplexml_load_string($xml)->каталог->описание


Само собой, только если скрипт в UTF8
7. I_CaR - 06 Августа, 2012 - 12:07:30 - перейти к сообщению
попробовал. выдаёт ошибку, как раз по строке 5 :
"Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 4: parser error : Start tag expected, '<' not found in Z:\........\xml_4.php on line 5"
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  header('Content-type: text/html; charset=utf-8');
  3.  
  4.  $xml = simplexml_load_file('XML/file.xml');
  5.  simplexml_load_string($xml)->{'каталог'}->{'описание'};
  6.  
  7.  foreach ($xml->каталог as $catalogue)
  8.  {
  9. ....
  10. }



Такой вот подход тоже не подошёл.
PHP:
скопировать код в буфер обмена
  1.  
  2. ...
  3. foreach ($parametr->{'каталог'} as $catalog)
  4. ...
  5.  


P.S.
Вот если есть код
print ($catalogue->name);
в XML меняю параметр name на наименование
то как его получить исходя из print ($catalogue->name);?
получается, что print ($catalogue->{'наименование'});
Но так данные с этого параметра не приходят.
8. I_CaR - 07 Августа, 2012 - 06:36:13 - перейти к сообщению
Тишина...
Неужели ни кто с рускоязычным XML не работает?
9. Мелкий - 07 Августа, 2012 - 08:41:11 - перейти к сообщению
Вы хоть почитайте, что такое simplexml_load_string.
10. DlTA - 07 Августа, 2012 - 09:08:18 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. $xml =
  3. '<КоммерческаяИнформация>
  4.        <Каталог Идентификатор="ntrcn" Наименование="Тузики" Владелец="yyyyyy" Единица="шт">
  5.                <Свойство Идентификатор="Комментарий" Наименование="Дополнительная информация"/>
  6.                <Свойство Идентификатор="ПолноеНаименование" Наименование="Полное наименование"/>
  7.              
  8.                <Товар Идентификатор="aaaaaa" ИдентификаторВКаталоге="aaaaaa" Наименование="Тузик с хвостом" Родитель="bbbbbb" Единица="шт">
  9.                <ЗначениеСвойства ИдентификаторКаталога="cccccc" ИдентификаторСвойства="ПолноеНаименование" Значение="Тузик с хвостом"/>
  10.                </Товар>
  11.              
  12.                <Группа Идентификатор="внук" ИдентификаторВКаталоге="внук" Наименование="Собаки" Родитель="сын"/>
  13.                <Группа Идентификатор="сын" ИдентификаторВКаталоге="сын" Наименование="Тузики" Родитель="родитель"/>
  14.                <Группа Идентификатор="родитель" ИдентификаторВКаталоге="родитель" Наименование="без документов"/>
  15.        </Каталог>
  16. </КоммерческаяИнформация>';
  17. $xmlData = simplexml_load_string($xml);
  18. var_dump($xmlData->asXML());
  19. var_dump($xmlData->{'Каталог'}->attributes());

как не странно но все замечательно обрабатывается
11. I_CaR - 08 Августа, 2012 - 06:05:39 - перейти к сообщению
Вы меня простите за недопонимание, но с передачей параметров через XML, я столкнулся впервые.
Попробовал:
var_dump($xml->{'Каталог'}->attributes('Единица'));
здесь выходит ошибка - "var_dump() [function.var-dump]: Node no longer exists in [путь\файл].php on line 10
object(SimpleXMLElement)#3 (0) { }"
и так:
var_dump($xml->{'Каталог'}->{'Единица'});
здесь получаю NULL
----------------
это XML:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?xml version="1.0" encoding="windows-1251"?>
  3. <messages>
  4.    <parametr>
  5.        <catalogue id="10" catalogname="Каталог 1">
  6.        <name tovname="Товар 1"/>
  7.        <text tovtext="текст о товаре 1"/>
  8.        <price internet="95" rozn="100" opt="90"/>
  9.        </catalogue>
  10.    </parametr>
  11. </messages>
  12.  

Вот хотелось бы сообразить код в таком варианте (для XML на кириллице):
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  header('Content-type: text/html; charset=windows-1251');
  3.  $xml = simplexml_load_file('XML/data.xml');
  4. // $xml->{'имя'}->{'наименование'}; - это пробовал для кириллицы
  5.  foreach ($xml->parametr as $parametr)
  6.  {
  7.           foreach ($parametr->catalogue as $catalogue)
  8.           {
  9.                  print ($catalogue[catalogname]);                
  10.                  print ($catalogue[id]);
  11.                  print ($catalogue->{name}["tovname"]);
  12.                              // вот почему не получается получить параметр так?
  13.                              // print (${каталог}->{имя}["наименование"]);
  14.                              // если дерево в XML: каталог->имя(наименование="штучка-дрючка")
  15.                  print ($catalogue->price[internet]);
  16.                  print ($catalogue->text[tovtext]);
  17.       }
  18.  }
  19. ?>
12. Мелкий - 08 Августа, 2012 - 09:41:59 - перейти к сообщению
Метод attributes принимает namespace, а не имя желаемого параметра в качестве аргумента.

PHP:
скопировать код в буфер обмена
  1. $xml->{'Каталог'}->attributes()->{'Единица'}


Так же мне очень любопытно, нафига вы высылаете заголовок с кодировкой cp1251, хотя работаете априори в UTF8? Повторюсь, вы работаете именно в UTF8 - SimpleXML представляет интерфейс только в UTF8, вне зависимости от кодировки исходного документа (т.к. сам делает iconv, если надо).
13. I_CaR - 09 Августа, 2012 - 06:19:41 - перейти к сообщению
Всё! Задачу решил! Не только указанием кодировки XML в коде "header('...charset...)", но и + перекодировки самого PHP. (и это ещё только локально, что ещё ждёт на серваке у хостера не известно...). Хм
Вот блин кириллица, и кто её продвигает?
14. I_CaR - 10 Августа, 2012 - 06:01:00 - перейти к сообщению
Мелкий пишет:

Цитата:
PHP:
скопировать код в буфер обмена
  1. simplexml_load_string($xml)->{'каталог'}->{'описание'}
  2.  

В общем-то, даже


Само собой, только если скрипт в UTF8

utf8 Блин! Как же дорога эта кодировочка.
Спасибо! Мелкий, я просто упустил из виду последнюю твою строку! Блин! Не хватает внимательности!

 

Powered by ExBB FM 1.0 RC1