gpt4 book ai didi

php - 如何使用xquery查找节点并向其添加子节点?

转载 作者:行者123 更新时间:2023-12-02 05:20:52 27 4
gpt4 key购买 nike

是否可以使用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");

到达该节点,但从未设法将其用作父节点。

问题:如何使用该位置来appendChild $fragment?可能吗?

**YOUR BEAUTIFUL MAGIC**

最后我会保存它。

echo $doc->saveXML();

感谢您为我提供的任何帮助。

最佳答案

几个问题:

  1. 您的 xpath 表达式应为 /books/book/placeItHere(以 / 开头)。
  2. DOMXPath::query() 返回 DOMNodeList 而不是 DOMNode ,因此您需要从中获取 item()

我很少建议使用文档片段,因为快速而随意地使用原始 XML 经常会导致问题。例如,如果您的书名包含与号appendXML(),则会出现解析器错误。

相反,我建议 createElement()createTextNode() ,它将自动处理将 & 转换为 & 的内容。

<小时/>

示例:

$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>

关于php - 如何使用xquery查找节点并向其添加子节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27486409/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com