Узел CDATA редактирования Simplexml - PullRequest
1 голос
/ 10 ноября 2011

У меня есть XML-файл, я хочу открыть его, отредактировать определенный узел CDATA со значениями из ввода $ _POST и сохранить его как тот же файл, я прочитал некоторую онлайн-документацию и в итоге здесь, кто-то, пожалуйста, предложите хорошийспособ сделать это ...

Regardsh

Ответы [ 4 ]

1 голос
/ 10 ноября 2011

SimpleXML не делает элементы CDATA доступными по умолчанию.Вы можете указать simplexml пропустить их (по умолчанию) или прочитать их (см .: чтение cdata из RSS-канала ).Если вы читаете их, они являются стандартными текстовыми значениями, поэтому они объединяются с другими текстовыми узлами.

Дополнительные возможности предоставляются объектной моделью документа Документы , который предлагает DOMCdataSection, который расширяется от DOMText, стандартной модели текстового узла.

Даже если это другая библиотека PHP (DOM vs. SimpleXML), оба совместимы друг с другом.Например, SimpleXMLElement можно преобразовать в DOMElement с помощью функции dom_import_simplexml.

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

1 голос
/ 21 августа 2013

Поскольку у меня была такая же проблема совсем недавно, я хотел, чтобы люди также видели некоторый код, потому что связанные примеры могут только добавлять новые разделы CDATA, но не удалять старые. Таким образом, «мои» решения объединены с упомянутым примером кода плюс удаление старого узла CDATA.

// get DOM node
$node = dom_import_simplexml($mySimpleXmlElement); 


// remove existing CDATA ($node->childNodes->item(1) does not seem to work)
foreach($node->childNodes as $child) {
  if ($child->nodeType == XML_CDATA_SECTION_NODE) {
    $node->removeChild($child);
  }
}

// add new CDATA
$no = $node->ownerDocument; 
$node->appendChild($no->createCDATASection($myNewContent)); 

// print result
echo $xml->asXML();
0 голосов
/ 02 сентября 2018

Вы можете расширить класс SimpleXMLElement с помощью функции simples, чтобы сделать это

class ExSimpleXMLElement extends SimpleXMLElement {
    /**
     * Add CDATA text in a node
     * @param string $cdata_text The CDATA value  to add
     */
    private function addCData($cdata_text) {
        $node = dom_import_simplexml($this);
        $no = $node->ownerDocument;
        $node->appendChild($no->createCDATASection($cdata_text));
    }

    /**
     * Create a child with CDATA value
     * @param string $name The name of the child element to add.
     * @param string $cdata_text The CDATA value of the child element.
     */
    public function addChildCData($name, $cdata_text) {
        $child = $this->addChild($name);
        $child->addCData($cdata_text);

        return $child;
    }

    /**
     * Modify a value with CDATA value
     * @param string $name The name of the node element to modify.
     * @param string $cdata_text The CDATA value of the node element.
     */
    public function valueChildCData($name, $cdata_text) {

        $name->addCData($cdata_text);

        return $name;
    }
}

использование:

$xml_string = <<<XML
        <root>
            <item id="foo"/>
        </root>
XML;

$xml5 = simplexml_load_string($xml_string, 'ExSimpleXMLElement');
$xml5->valueChildCData($xml5->item, 'mysupertext');
echo $xml5->asXML();

$xml6 = simplexml_load_string($xml_string, 'ExSimpleXMLElement');
$xml6->item->addChildCData('mylittlechild', 'thepunishment');
echo $xml6->asXML();

результат:

<?xml version="1.0"?>
<root>
  <item id="foo"><![CDATA[mysupertext]]></item>
</root>

<?xml version="1.0"?>
<root>
  <item id="foo">
    <mylittlechild><![CDATA[thepunishment]]></mylittlechild>
  </item>
</root>
0 голосов
/ 10 ноября 2011

Я предлагаю вам использовать это http://www.php.net/manual/en/class.domdocument.php

...