Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用DOM插入新行_Php_Xml_Dom_Simplexml - Fatal编程技术网

Php 使用DOM插入新行

Php 使用DOM插入新行,php,xml,dom,simplexml,Php,Xml,Dom,Simplexml,我试图在XML文档中插入一个新节点。我使用simpleXML进行大部分解析,但对于这一部分,我需要使用DOM。这是我用来做加法的函数 function simplexml_insert_after(SimpleXMLElement $sxe, SimpleXMLElement $insert, SimpleXMLElement $target) { $target_dom = dom_import_simplexml($target); $target_dom->f

我试图在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);
<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"/>
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);
    }
}

尝试将方法调用更改为:

simplexml_insert_after($my_xml, "\n" . $meta2, $target);

…使用
preserveWhiteSpace=true

尝试在要插入的元素之前插入一个textnode,如下所示:

$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);
<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"/>
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);
    }
}

谢谢你的建议,不幸的是,它给了我这个错误:传递给simplexml_insert_after()的参数2必须是SimpleXmlElementThank类的对象。我认为这是正确的,但在进行更改时,我收到了这样一条消息:
调用未定义的方法domeElement::createTextNode()
试试$target\u dom->ownerDocument->createTextNode(“\n”),因为createTextNode是一个DomDocument方法(我现在手头上没有php,自己也无法尝试),你摇滚,这就解决了。我对DOM还是个新手,但我应该抓住这个机会。再次感谢!