Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вставка нового узла в XML / 7 сообщений из 7, страница 1 из 1
19.10.2015, 15:33
    #39080243
eklm86
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка нового узла в XML
В 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
19.10.2015, 17:27
    #39080466
kunaksergey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка нового узла в XML
Ну так ты ж цепляешь к документу,а не к узлу <fieldset>
...
Рейтинг: 0 / 0
19.10.2015, 18:20
    #39080553
eklm86
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка нового узла в XML
А как к узлу fieldset прицепить?

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



А $newfield чем проинициализировать тогда?
...
Рейтинг: 0 / 0
19.10.2015, 18:21
    #39080555
kunaksergey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка нового узла в XML
Код: 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
19.10.2015, 18:47
    #39080577
eklm86
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка нового узла в XML
kunaksergey, да, так работает.

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



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


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