2014-10-23 2 views
1

У меня есть пример, где мне нужно обновить узел XML на основе XPath. SimpleXMLElement делает это достаточно простым, используя XPath для захвата узла, а затем обновляет его значение в формате перекрестных ссылок.Создание XML из XPath

Однако это не работает вообще, если узел фактически не существует, который необходимо обновить. Существуют ли какие-либо простые способы автоматического генерации XML, который соответствует XPath, если он не существует?

Пример:

<example> 
    <childNode1>green</childNode1> 
</example> 

Учитывая XML, я мог легко выполнить команду XPATH, чтобы получить <childNode1> загрузив вверх XML в SimpleXMLElement и затем запустить $xml->xpath("example/childNode1");. Затем я мог бы установить значение возвращаемого SimpleXMLElement на что-то новое, а затем сохранить xml.

Однако, если мне нужно было установить что-то вроде <childNode2>, то $xml->xpath("example/childNode2") ничего не вернет, и установить значение не будет, или подтвердить, что XML был построен.

Итерируется через XPath и анализирует его значения, единственный способ подтвердить, что каждый дочерний узел существует, а затем построить их по мере его появления или есть лучший способ генерировать необходимый XPath?

+1

Я ответил на что-то подобное для JavaScript некоторое время назад: http://stackoverflow.com/a/26296087/2265374 – ThW

ответ

2

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

PHP SimpleXML и DOM имеют XPath-реализации и позволяют создавать или обновлять структуры XML; Я предполагаю, что вы знаете о них, так как вы говорите об редактировании узлов (я могу привести примеры, если вы этого не сделаете). Чтобы выполнить такие добавления узлов, которые вы предлагаете, вам нужно выяснить, существовал ли узел (например, если запрос xpath для example/node1 вернул узел, но example/node2 ничего не ответил), создайте новый узел и добавьте его в XML дерево. Для длинных xpath, например. example/apple/blueberry/canola/date/emblem/node1, вам действительно нужно проанализировать путь и проверить, какие элементы существуют, и добавить те, которые этого не сделали.

XQuery, более мощный, полнофункциональный язык XML-запросов, частью которого являются XPath 2 и XPath, будет возможность преобразовывать XML. XQuery находится в активной разработке, но, к сожалению, в текущих реализациях (по состоянию на конец 2014 года) отсутствует возможность обновления XML. Смотрите это пространство!

+0

Большое спасибо, я буду следить за XQuery! – sailboatlie