powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вставка нового узла в XML
7 сообщений из 7, страница 1 из 1
Вставка нового узла в XML
    #39080243
eklm86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 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, а не внутри fieldset.


Второй способ
Код: 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 / 0
Вставка нового узла в XML
    #39080466
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну так ты ж цепляешь к документу,а не к узлу <fieldset>
...
Рейтинг: 0 / 0
Вставка нового узла в XML
    #39080553
eklm86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как к узлу fieldset прицепить?

Как-то так может, в новый элемент массива детей fieldset
Код: php
1.
$xml->children('fieldset')[count($xml->children('fieldset'))] = $newfield;



А $newfield чем проинициализировать тогда?
...
Рейтинг: 0 / 0
Вставка нового узла в XML
    #39080555
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
31.
32.
33.
34.
35.
36.
37.
<?php
header("Content-type:xml");
$xml=<<<XML
<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>
XML;

$Doc = new DOMDocument();
$Doc->loadXml($xml);
$xpath = new DOMXpath($Doc);
$parent=$xpath->query("/extension/config/fields/fieldset");
$elements=$xpath->query("/extension/config/fields/fieldset/field[type='media']");

$elements=$Doc->getElementsByTagName('field');
$field = $Doc->createElement('field');
$name_att = $Doc->createAttribute("name");
$nextNum=$elements->length+1;
$value='img'.$nextNum;
$name_att->value = $value;

$field->appendChild($name_att);
$type_att = $Doc->createAttribute("type");
$type_att->value = 'media';
$field->appendChild($type_att);
$parent[0]->appendChild($field);
echo $Doc->saveXML();
...
Рейтинг: 0 / 0
Вставка нового узла в XML
    #39080577
eklm86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kunaksergey, да, так работает.

Единственное, xpath
Код: php
1.
$elements=$xpath->query("/extension/config/fields/fieldset/field[type='media']");



берёт почему-то все теги field, а не только с type='media'
Но это уже детали.
...
Рейтинг: 0 / 0
Вставка нового узла в XML
    #39080637
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кажется должно быть field[@type='media']
...
Рейтинг: 0 / 0
Вставка нового узла в XML
    #39080683
eklm86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее да.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вставка нового узла в XML
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]