Как распарсить XML[Решено]

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
svil
Сообщения: 538
Зарегистрирован: 2018.02.12, 22:41

Как распарсить XML[Решено]

Сообщение svil » 2019.07.18, 17:50

xml в папке web :

Код: Выделить всё

<?xml version="1.0" encoding="UTF-8"?>

<categories>
    <item>
        <id>1</id>
        <name>Nika</name>
    </item>
    <item>
        <id>2</id>
        <name>Stepan</name>
    </item>
    <item>
        <id>3</id>
        <name>Marusia</name>
    </item>
</categories>
Пытаюсь распарсить, не получается-ничего не выводит и ошибок тоже нет

Код: Выделить всё

$xmlData = simplexml_load_file('file.xml');

//в цикле создаем объекты с параметрами, и пишем в базу
foreach($xmlData as $key => $item) {
    print_r($item->categories->item['name']);
}
Последний раз редактировалось svil 2019.07.23, 18:00, всего редактировалось 1 раз.

Аватара пользователя
svil
Сообщения: 538
Зарегистрирован: 2018.02.12, 22:41

Re: Как распарсить XML

Сообщение svil » 2019.07.18, 18:30

Теоретически нашла ответ : Загружаете хмл, как обычный файл на сервер, получаете его содержание, берете нужные данные из хмл с помощью SimpleXML, расталкиваете их куда хотите по какой хотите логике.
Но практически как?


Аватара пользователя
svil
Сообщения: 538
Зарегистрирован: 2018.02.12, 22:41

Re: Как распарсить XML

Сообщение svil » 2019.07.18, 19:16

Читала - не поняла.

Код: Выделить всё

$xmlString=file_get_contents(Yii::getAlias('@app/web/') . 'categories.xml');
$xml = simplexml_load_string($xmlString,'SimpleXMLElement', LIBXML_NOCDATA);

$xml = new \SimpleXMLElement('categories.xml');
echo $xml->categories->item['Id'];
echo "<br/>";
echo $xml->categories->item['name'];
 or...........
foreach ($xml->categories->item as $element) {
    foreach($element as $key => $val) {
        echo "{$key}: {$val}";
    }
}

Аватара пользователя
svil
Сообщения: 538
Зарегистрирован: 2018.02.12, 22:41

Re: Как распарсить XML

Сообщение svil » 2019.07.18, 19:17

КАк в SimpleXMLElement попадает xml файл и в каком виде попадает?

Аватара пользователя
svil
Сообщения: 538
Зарегистрирован: 2018.02.12, 22:41

Re: Как распарсить XML

Сообщение svil » 2019.07.18, 19:21

Так попробовала - ошибка

Код: Выделить всё

DOMDocument::loadXML(): Start tag expected, '&lt;' not found in Entity, line: 1

Код: Выделить всё

$dom = new DOMDocument;
$dom->loadXML('categories.xml');
if (!$dom) {
    echo 'Ошибка при разборе документа';
    exit;
}

$books = simplexml_import_dom($dom);

echo $books->categories->item->name;

Loveorigami
Сообщения: 971
Зарегистрирован: 2014.08.27, 21:54

Re: Как распарсить XML

Сообщение Loveorigami » 2019.07.18, 19:27

там же объект

$categories = simplexml_load_file('categories.xml');

$echo $categories->item[0]->name;

в точности, как на примере - https://www.php.net/manual/ru/simplexml ... -basic.php


Аватара пользователя
leonenco
Сообщения: 121
Зарегистрирован: 2017.01.30, 22:42

Re: Как распарсить XML

Сообщение leonenco » 2019.07.19, 07:39

Попробуй так создай метод и как параметер передай свой SimpleXMLElement:

Код: Выделить всё

protected function parseXml(SimpleXMLElement $xmlObject)
{
     return json_decode(json_encode($xmlObject));
}
На выходе получвешь обьект.

Аватара пользователя
svil
Сообщения: 538
Зарегистрирован: 2018.02.12, 22:41

Re: Как распарсить XML

Сообщение svil » 2019.07.19, 10:37

Так работает, спасибо, Loveorigami

Код: Выделить всё

$categories = simplexml_load_file('categories.xml');
for($i=0; $i<count($categories); $i++)
{
    echo "{$categories->item[$i]->id} => {$categories->item[$i]->name} ";
    echo "<br/>";
}

Loveorigami
Сообщения: 971
Зарегистрирован: 2014.08.27, 21:54

Re: Как распарсить XML

Сообщение Loveorigami » 2019.07.19, 10:57

проще, через foreach

Код: Выделить всё


$categories = simplexml_load_file('categories.xml');
foreach($categories->item as $item)
{
    echo $item->id . ' - '. $item->name;
    echo "<br/>";
}


Аватара пользователя
svil
Сообщения: 538
Зарегистрирован: 2018.02.12, 22:41

Re: Как распарсить XML

Сообщение svil » 2019.07.19, 12:42

Не могу найти ошибку
Таблица categories в БД с первичным ключом id_pk и полями для парсинга id(text) и name(text)

Код: Выделить всё

Attempt to assign property of non-object

 $categories_xml = simplexml_load_file('categories.xml');
               for($i=0; $i<count($categories_xml); $i++)

        { $categories = Categories::find()->all();
                if (!isset($categories->id)){
            $categories->id = $categories_xml->item[$i]->id; //здесь ошибка
            $categories->name = $categories_xml->item[$i]->name;
         
            $categories->save();
             //}
        }

Loveorigami
Сообщения: 971
Зарегистрирован: 2014.08.27, 21:54

Re: Как распарсить XML

Сообщение Loveorigami » 2019.07.19, 13:12

Тут у вас массив
$categories = Categories::find()->all()

а вы обращаетесь, как к объекту
$categories->id

Loveorigami
Сообщения: 971
Зарегистрирован: 2014.08.27, 21:54

Re: Как распарсить XML

Сообщение Loveorigami » 2019.07.19, 13:31

Код: Выделить всё

$categories = simplexml_load_file('categories.xml');

foreach($categories->item as $item)
{
    $model =  Categories::find()->byId(item->id)->one();
    if($model){
           $model->name = $item->name;
           $model->save();
    }
}

Аватара пользователя
svil
Сообщения: 538
Зарегистрирован: 2018.02.12, 22:41

Re: Как распарсить XML

Сообщение svil » 2019.07.19, 15:53

Спасибо за помощь. Проблема в другом ЕЩЕ оказся была... надо было четко прописать тип (string)

Код: Выделить всё

foreach($categories->item as $item)
{
    $model = new Categories();
    $k1= $item->id;
    $k2 =  $item->name;

    echo $k1."-".$k2;
    echo "<br/>";
    $model->id =(string)$k1;
    $model->name = (string)$k2;
    $model->save();

}

Аватара пользователя
svil
Сообщения: 538
Зарегистрирован: 2018.02.12, 22:41

Re: Как распарсить XML

Сообщение svil » 2019.07.22, 23:23

Оказывается надо было закодировать и потом раскодировать json - и всё
Контроллер

Код: Выделить всё

class ProductsarController extends Controller
{
    
    public function actionIndex()
    {

        //парсинг
        $xml_string = "categories.xml";
        $xml = simplexml_load_file($xml_string);
        $json = json_encode($xml); // туть
        $array = json_decode($json,TRUE); // и туть

        $dataProvider= new ArrayDataProvider([
            'allModels' => $array['item'],

            'sort' => [
                'attributes' => ['id', 'name'],
            ],
        ]);
//конец парсинга

        return $this->render('index', [
            'dataProvider' => $dataProvider,
            'array' => $array,


        ]);
    }
Вид

Код: Выделить всё

use yii\grid\GridView;

echo \yii\grid\GridView::widget(
    [
        
        'dataProvider' => $dataProvider,
       
        'columns' => [
            
            [
                'class' => \yii\grid\SerialColumn::class,
            ],
           
            'id',

            'name',
           
        ],
    ]
);

debug($array['item']);
Теперь бы еще поиск и подстановку поля(вместо id_name другое поле по ключу из другого xml файла настроить, где name).

Аватара пользователя
leonenco
Сообщения: 121
Зарегистрирован: 2017.01.30, 22:42

Re: Как распарсить XML[Решено]

Сообщение leonenco » 2019.07.24, 02:01

я вам об этом сразу сказал.

Аватара пользователя
svil
Сообщения: 538
Зарегистрирован: 2018.02.12, 22:41

Re: Как распарсить XML[Решено]

Сообщение svil » 2019.07.26, 21:26

Спасибо. Я этот метод неправильно применила и не поняла из-за этого его нужность.

Код: Выделить всё

protected function parseXml(SimpleXMLElement $xmlObject)
{
     return json_decode(json_encode($xmlObject));
}

Ответить