Страница 1 из 1
Как распарсить XML[Решено]
Добавлено: 2019.07.18, 17:50
svil
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']);
}
Re: Как распарсить XML
Добавлено: 2019.07.18, 18:30
svil
Теоретически нашла ответ : Загружаете хмл, как обычный файл на сервер, получаете его содержание, берете нужные данные из хмл с помощью SimpleXML, расталкиваете их куда хотите по какой хотите логике.
Но практически как?
Re: Как распарсить XML
Добавлено: 2019.07.18, 19:02
masson
Re: Как распарсить XML
Добавлено: 2019.07.18, 19:16
svil
Читала - не поняла.
Код: Выделить всё
$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}";
}
}
Re: Как распарсить XML
Добавлено: 2019.07.18, 19:17
svil
КАк в SimpleXMLElement попадает xml файл и в каком виде попадает?
Re: Как распарсить XML
Добавлено: 2019.07.18, 19:21
svil
Так попробовала - ошибка
Код: Выделить всё
DOMDocument::loadXML(): Start tag expected, '<' 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;
Re: Как распарсить XML
Добавлено: 2019.07.18, 19:27
Loveorigami
там же объект
$categories = simplexml_load_file('categories.xml');
$echo $categories->item[0]->name;
в точности, как на примере -
https://www.php.net/manual/ru/simplexml ... -basic.php
Re: Как распарсить XML
Добавлено: 2019.07.19, 06:28
kukuruku
Re: Как распарсить XML
Добавлено: 2019.07.19, 07:39
leonenco
Попробуй так создай метод и как параметер передай свой SimpleXMLElement:
Код: Выделить всё
protected function parseXml(SimpleXMLElement $xmlObject)
{
return json_decode(json_encode($xmlObject));
}
На выходе получвешь обьект.
Re: Как распарсить XML
Добавлено: 2019.07.19, 10:37
svil
Так работает, спасибо, 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/>";
}
Re: Как распарсить XML
Добавлено: 2019.07.19, 10:57
Loveorigami
проще, через foreach
Код: Выделить всё
$categories = simplexml_load_file('categories.xml');
foreach($categories->item as $item)
{
echo $item->id . ' - '. $item->name;
echo "<br/>";
}
Re: Как распарсить XML
Добавлено: 2019.07.19, 12:42
svil
Не могу найти ошибку
Таблица 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();
//}
}
Re: Как распарсить XML
Добавлено: 2019.07.19, 13:12
Loveorigami
Тут у вас массив
$categories = Categories::find()->all()
а вы обращаетесь, как к объекту
$categories->id
Re: Как распарсить XML
Добавлено: 2019.07.19, 13:31
Loveorigami
Код: Выделить всё
$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();
}
}
Re: Как распарсить XML
Добавлено: 2019.07.19, 15:53
svil
Спасибо за помощь. Проблема в другом ЕЩЕ оказся была... надо было четко прописать тип (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();
}
Re: Как распарсить XML
Добавлено: 2019.07.22, 23:23
svil
Оказывается надо было закодировать и потом раскодировать 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).
Re: Как распарсить XML[Решено]
Добавлено: 2019.07.24, 02:01
leonenco
я вам об этом сразу сказал.
Re: Как распарсить XML[Решено]
Добавлено: 2019.07.26, 21:26
svil
Спасибо. Я этот метод неправильно применила и не поняла из-за этого его нужность.
Код: Выделить всё
protected function parseXml(SimpleXMLElement $xmlObject)
{
return json_decode(json_encode($xmlObject));
}