我正在尝试将新节点插入到XML文档中。我正在使用simpleXML进行大部分解析,但对于这篇文章,我需要使用DOM。这是我用来添加的功能
function simplexml_insert_after(SimpleXMLElement $sxe, SimpleXMLElement $insert, SimpleXMLElement $target)
{
$target_dom = dom_import_simplexml($target);
$target_dom->formatOutput = true;
$target_dom->preserveWhiteSpace = false;
$insert_dom = $target_dom->ownerDocument->importNode(dom_import_simplexml($insert), true);
if ($target_dom->nextSibling) {
return $target_dom->parentNode->insertBefore($insert_dom, $target_dom->nextSibling);
} else {
return $target_dom->parentNode->appendChild($insert_dom);
}
}
并且这样称呼它:
$meta2 = new SimpleXMLElement("<meta/>");
$meta2->addAttribute('name', 'subject');
$meta2->addAttribute('value', $doc_id);
$target = current($my_xml->xpath('//meta[last()]'));
simplexml_insert_after($my_xml, $meta2, $target);
我的问题是它在目标之后立即插入新节点而不是新行,因此生成的XML看起来像这样:
<meta content="a" name="ap-category"/>
<meta content="bx" name="ap-format"/><meta name="subject" value="urn:blah"/>
当我希望它看起来像这样:
<meta content="a" name="ap-category"/>
<meta content="bx" name="ap-format"/>
<meta name="subject" value="urn:blah"/>
我已经尝试将preserveWhiteSpace更改为true,但它没有帮助。如何在插入该节点之前添加新行?
修改 这是有效的修复:
function simplexml_insert_after(SimpleXMLElement $sxe, SimpleXMLElement $insert,SimpleXMLElement $target)
{
$target_dom = dom_import_simplexml($target);
$target_dom->formatOutput = true;
$target_dom->preserveWhiteSpace = false;
$insert_dom = $target_dom->ownerDocument->importNode(dom_import_simplexml($insert), true);
if ($target_dom->nextSibling) {
$result = $target_dom->parentNode->insertBefore($insert_dom, $target_dom->nextSibling);
$target_dom->parentNode->insertBefore($target_dom->ownerDocument->createTextNode("\n"), $result);
return $result
} else {
return $target_dom->parentNode->appendChild($insert_dom);
}
}
答案 0 :(得分:4)
尝试在要插入的元素之前插入一个textnode,如下所示:
function simplexml_insert_after(SimpleXMLElement $sxe,
SimpleXMLElement $insert,
SimpleXMLElement $target)
{
$target_dom = dom_import_simplexml($target);
$target_dom->formatOutput = true;
$target_dom->preserveWhiteSpace = false;
$document = $target_dom->ownerDocument;
$insert_dom = $document->importNode(dom_import_simplexml($insert), true);
$parentNode = $target_dom->parentNode;
if ($target_dom->nextSibling) {
$result = $parentNode->insertBefore($insert_dom, $target_dom->nextSibling);
$parentNode->insertBefore($document->createTextNode("\n"), $result);
return $result
} else {
return $parentNode->appendChild($insert_dom);
}
}
答案 1 :(得分:0)
尝试将方法调用更改为:
simplexml_insert_after($my_xml, "\n" . $meta2, $target);
...与preserveWhiteSpace = true;