Как использовать xquery для поиска узла и добавления в него addChild?

Можно ли использовать xpath / xquery для запроса определенного узла xml, а затем импортировать / добавить в него дочерний узел?

Пример (код взят из http://codepad.org/gJ1Y2LjM , что было представлено в аналогичном вопросе, но не то же самое):

1.
Я хочу добавить массив

$book = array('isbn'=>123456789099, 'title' => 'Harry Potter 3', 'author' => 'J K. Rowling', 'edition' => '2007');

2.
Для существующего XML.

$doc = new DOMDocument();
$doc->loadXML('<?xml version="1.0"?>
<books>
<book>
<isbn>123456789098</isbn>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<edition>2005</edition>
</book>
<book>
<placeItHere></placeItHere>
<isbn>1</isbn>
<title>stuffs</title>
<author>DA</author>
<edition>2014</edition>
</book>
</books>');

3.
Для этого используется следующий фрагмент.

$fragment = $doc->createDocumentFragment();
$fragment->appendXML("    <book>
<isbn>{$book['isbn']}</isbn>
<title>{$book['title']}</title>
<author>{$book['author']}</author>
<edition>{$book['edition']}</edition>
</book>
");

4.
Но вместо добавления его к корневому узлу, есть почти каждый пример, который я нашел в интернете:

$doc->documentElement->appendChild($fragment);

5.
Я хочу добавить его (p.ex) к узлу, найденному в / books / book / placeItHere, и использовать не getElementbyId или tagName, а xpath / xquery. я пытался

$xp = new domxpath($doc);
$parent = $xp->query("books/book/placeItHere");

добраться до узла, но так и не удалось использовать его в качестве родителя.

Вопрос: Как использовать это местоположение для добавления фрагмента $ $? Является ли это возможным?

**YOUR BEAUTIFUL MAGIC**

В конце я просто сохраню это.

echo $doc->saveXML();

Спасибо за любую помощь, которую вы можете оказать мне.

2

Решение

Пара проблем:

  1. Ваше выражение xpath должно быть /books/book/placeItHere (с ведущими /).
  2. DOMXPath::query() возвращает DOMNodeList а не DOMNode, так что вам нужно взять свой item() от него.

Я редко рекомендую использовать фрагменты документов, так как быстрое и свободное воспроизведение с необработанным XML регулярно приводит к проблемам. Например, если название вашей книги включает в себя амперсанд appendXML() вытащил бы с ошибкой парсера.

Вместо этого я предлагаю createElement() а также createTextNode(), который будет обрабатывать трансформирующие вещи, такие как & в &amp; автоматически.


Пример:

$xml = <<<'XML'
<?xml version="1.0"?>
<books>
<book>
<isbn>123456789098</isbn>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<edition>2005</edition>
</book>
<book>
<placeItHere></placeItHere>
<isbn>1</isbn>
<title>stuffs</title>
<author>DA</author>
<edition>2014</edition>
</book>
</books>
XML;

$book = [
'isbn'    => 123456789099,
'title'   => 'Harry Potter 3',
'author'  => 'J K. Rowling',
'edition' => '2007'
];

$dom = new DOMDocument();
$dom->formatOutput = true;
$dom->preserveWhiteSpace = false;
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);

$placeItHere = $xpath->query('/books/book/placeItHere')->item(0);
$newBook = $placeItHere->appendChild($dom->createElement('book'));
foreach ($book as $part => $value) {
$element = $newBook->appendChild($dom->createElement($part));
$element->appendChild($dom->createTextNode($value));
}

echo $dom->saveXML();

Выход:

<?xml version="1.0"?>
<books>
<book>
<isbn>123456789098</isbn>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<edition>2005</edition>
</book>
<book>
<placeItHere>
<book>
<isbn>123456789099</isbn>
<title>Harry Potter 3</title>
<author>J K. Rowling</author>
<edition>2007</edition>
</book>
</placeItHere>
<isbn>1</isbn>
<title>stuffs</title>
<author>DA</author>
<edition>2014</edition>
</book>
</books>
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]