Форум программистов, компьютерный форум, киберфорум
PHP: API, боты
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 1
Регистрация: 19.08.2014
Сообщений: 96
1

Вставка нового узла в XML

19.10.2015, 14:34. Показов 800. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В xml такой структуры нужно вставлять новые теги field
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<extension>
    <config>
        <fields>
            <fieldset>
                <field name="img1" type="media"/>
                <field name="img2" type="media"/>
                <field name="img3" type="media"/>
                <field name="img4" type="media"/>
                <field name="img5" type="media"/>
            </fieldset>
        </fields>
    </config>
</extension>
То есть в данном случае нужно вставить новый field после <field name="img5" type="media"/>

Пробую двумя способами. Первый с помощью SimpleXmlElement
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        $reader = new XMLReader();
        $i = 0;
        while($reader->read() && $reader->name !== 'field');
        
        while ($reader->name === 'field')
        {
            if ($reader->getAttribute('type') == 'media') {
                $i++;
            }
            $reader->next('field');
        }
        $file = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/corner/modules/mod_slider3d/mod_slider3d.xml');
        $xml = new SimpleXMLElement($file);
        $newfield = $xml->addChild("field");
        $newfield->addAttribute('name', 'img'.++$i);
        $newfield->addAttribute('type', 'media');
        $outfile = fopen($_SERVER['DOCUMENT_ROOT'].'/corner/modules/mod_slider3d/mod_slider3d.xml', 'w');
        fwrite($outfile, $xml->asXML());
В этом случае тег <field name="img6" type="media"/> вставляется, но перед закрывающим корневым тегом </extension>


Второй способ
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        $reader = new XMLReader();
        $reader->open($_SERVER['DOCUMENT_ROOT'].'/corner/modules/mod_slider3d/mod_slider3d.xml');
        $i = 0;
        while($reader->read() && $reader->name !== 'field');
        
        while ($reader->name === 'field')
        {
            if ($reader->getAttribute('type') == 'media') {
                $i++;
            }
            $reader->next('field');
        }
        $parent = new DomDocument;
        $field = $parent->createElement('field');
        $name_att = $parent->createAttribute("name");
        $name_att->value = 'img'.++$i;
        $field->appendChild($name_att);
        $type_att = $parent->createAttribute("type");
        $type_att->value = 'media';
        $field->appendChild($type_att);
        $parent->appendChild($field);
        $dom = new DomDocument;
        $dom->loadXML(file_get_contents($_SERVER['DOCUMENT_ROOT'].'/corner/modules/mod_slider3d/mod_slider3d.xml'));
        $xpath = new DOMXpath($dom);
        $nodelist = $xpath->query('/extension/config/fields/fieldset/field[@name="img'.--$i.'"]');
        $prev_node = $nodelist->item(0);
        $newnode = $dom->importNode($parent->documentElement, true);
        //тут что-то еще нужно для вставки $newnode после $prev_node
        $outfile = fopen($_SERVER['DOCUMENT_ROOT'].'/corner/modules/mod_slider3d/mod_slider3d.xml', 'w');
        fwrite($outfile, $dom->saveXML());
Так не вставляется ничего, т.к. требуется еще какое-то действие для вставки $newnode после $prev_node.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.10.2015, 14:34
Ответы с готовыми решениями:

Вставка нового узла в двусвязный список
процедура вставки нового узла. Вот сделала вставку в голову и в хвост. но проблема с процедурой...

Вставка нового узла в бинарное дерево
Подскажите можно ли как-то реализовать, чтобы в консоле можно было вставлять новый узел, нахождение...

Вставка нового узла в заданную позицию циклического списка
Разработать численную модель, алгоритм и программу расчета по заданной математической модели. ...

Добавления нового узла в дерево XML файла
Еще раз приветствую, пытаюсь разобраться с &quot;linq to xml&quot;, на этот раз хотел бы спросить по данному...

2
512 / 454 / 119
Регистрация: 17.02.2012
Сообщений: 1,032
Записей в блоге: 1
19.10.2015, 18:23 2
PHP
1
2
3
4
5
6
7
8
$simple = new SimpleXMLElement(file_get_contents('test.xml'));
 
$newField = $simple->xpath('//fieldset')[0]->addChild('field');
 
$newField->addAttribute('name', 'img' . count($simple->xpath('//fieldset/field')));
$newField->addAttribute('type', 'media');
 
$simple->asXML('test.xml');
1
1 / 1 / 1
Регистрация: 19.08.2014
Сообщений: 96
19.10.2015, 22:11  [ТС] 3
Да, точно.
0
19.10.2015, 22:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2015, 22:11
Помогаю со студенческими работами здесь

Поиск узла в XML и вставка его в TreeView
Как сделать проверку что узел с такой то позицией есть в XML файле, и если узел есть в XML то...

Выбор узла XML по значению другого узла
Работаю с xml. Его структура такова : &lt;data&gt; &lt;item&gt; &lt;id&gt;182&lt;/id&gt; &lt;art_url/&gt; ...

Копирование определенного узла из одного XML в другой XML
Подскажите пожалуйста как скопировать узел из одного XML в другой XML в C++ Builder 6 &lt;?xml...

Добавление нового узла в B-дерево
Пусть я добавляю в дерево некоторый узел, такой что он должен быть добавлен после элемента s. Но:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru