PHP中的XML克隆节点
我必须克隆一个XML节点及其子节点,并将其附加到specifics标记中的新XML中 即: 源XML:PHP中的XML克隆节点,php,xml,clone,domdocument,Php,Xml,Clone,Domdocument,我必须克隆一个XML节点及其子节点,并将其附加到specifics标记中的新XML中 即: 源XML: <root> <element> <back> <item1>ABC</item1> <item2>DEF</item2> <more> <moreitem>GHI</moreitem> </more &l
<root>
<element>
<back>
<item1>ABC</item1>
<item2>DEF</item2>
<more>
<moreitem>GHI</moreitem>
</more
</back>
</element>
</root>
基础知识
DEF
GHI
DOMXpath::evaluate()
允许您使用Xpath表达式获取节点DOMDocument::importNode()
复制节点并将节点导入目标文档DOMNode::cloneNode()
创建要添加到同一文档中的节点副本DOMNode::appendChild()
允许您附加导入/克隆的节点
$source = <<<'XML'
<root>
<element>
<back>
<item1>ABC</item1>
<item2>DEF</item2>
<more>
<moreitem>GHI</moreitem>
</more>
</back>
</element>
</root>
XML;
$target = <<<'XML'
<root>
<base1>
<item1>FOO</item1>
<item2>BAR</item2>
<base2>
</base2>
</base1>
</root>
XML;
$sourceDocument = new DOMDocument();
$sourceDocument->loadXml($source);
$sourceXpath = new DOMXpath($sourceDocument);
$targetDocument = new DOMDocument();
$targetDocument->loadXml($target);
$targetXpath = new DOMXpath($targetDocument);
foreach ($targetXpath->evaluate('/root/base1/base2[1]') as $targetNode) {
foreach ($sourceXpath->evaluate('/root/element/back') as $backNode) {
$targetNode->appendChild($targetDocument->importNode($backNode, TRUE));
}
}
echo $targetDocument->saveXml();
$source=importNode($backNode,TRUE));
}
}
echo$targetDocument->saveXml();
输出:
<?xml version="1.0"?>
<root>
<base1>
<item1>FOO</item1>
<item2>BAR</item2>
<base2>
<back>
<item1>ABC</item1>
<item2>DEF</item2>
<more>
<moreitem>GHI</moreitem>
</more>
</back>
</base2>
</base1>
</root>
福
酒吧
基础知识
DEF
GHI
DOMXpath::evaluate()
允许您使用Xpath表达式获取节点DOMDocument::importNode()
复制节点并将节点导入目标文档DOMNode::cloneNode()
创建要添加到同一文档中的节点副本DOMNode::appendChild()
允许您附加导入/克隆的节点
$source = <<<'XML'
<root>
<element>
<back>
<item1>ABC</item1>
<item2>DEF</item2>
<more>
<moreitem>GHI</moreitem>
</more>
</back>
</element>
</root>
XML;
$target = <<<'XML'
<root>
<base1>
<item1>FOO</item1>
<item2>BAR</item2>
<base2>
</base2>
</base1>
</root>
XML;
$sourceDocument = new DOMDocument();
$sourceDocument->loadXml($source);
$sourceXpath = new DOMXpath($sourceDocument);
$targetDocument = new DOMDocument();
$targetDocument->loadXml($target);
$targetXpath = new DOMXpath($targetDocument);
foreach ($targetXpath->evaluate('/root/base1/base2[1]') as $targetNode) {
foreach ($sourceXpath->evaluate('/root/element/back') as $backNode) {
$targetNode->appendChild($targetDocument->importNode($backNode, TRUE));
}
}
echo $targetDocument->saveXml();
$source=importNode($backNode,TRUE));
}
}
echo$targetDocument->saveXml();
输出:
<?xml version="1.0"?>
<root>
<base1>
<item1>FOO</item1>
<item2>BAR</item2>
<base2>
<back>
<item1>ABC</item1>
<item2>DEF</item2>
<more>
<moreitem>GHI</moreitem>
</more>
</back>
</base2>
</base1>
</root>
福
酒吧
基础知识
DEF
GHI
这是一种简单的方法:
$src = new DOMDocument();
$dst = new DOMDocument();
$src->loadXML($src_xml);
$dst->loadXML($dst_xml);
$back = $src->getElementsByTagName('back')->item(0);
$base = $dst->getElementsByTagName('base2')->item(0);
$base->appendChild( $dst->importNode( $back, true ) );
echo $dst->saveXML();
这是一种简单的方法:
$src = new DOMDocument();
$dst = new DOMDocument();
$src->loadXML($src_xml);
$dst->loadXML($dst_xml);
$back = $src->getElementsByTagName('back')->item(0);
$base = $dst->getElementsByTagName('base2')->item(0);
$base->appendChild( $dst->importNode( $back, true ) );
echo $dst->saveXML();
当然,您可以使用本机编程语言来根据任何细微的需要重新构造XML文档。特别是在这里,您需要从外部源XML文件中提取XML内容。PHP和其他通用语言(Java、C#、Python、VB)一样,维护用于XSLT处理的库
XSLT(另存为.xsl或.XSLT文件以在下面的PHP中使用,并确保源和目标XML文件位于同一目录中)
输出(使用上面发布的源和目标xml)
福
酒吧
基础知识
DEF
GHI
当然,您可以使用本机编程语言来根据任何细微的需要重新构造XML文档。特别是在这里,您需要从外部源XML文件中提取XML内容。PHP和其他通用语言(Java、C#、Python、VB)一样,维护用于XSLT处理的库
XSLT(另存为.xsl或.XSLT文件以在下面的PHP中使用,并确保源和目标XML文件位于同一目录中)
输出(使用上面发布的源和目标xml)
福
酒吧
基础知识
DEF
GHI
我认为解决方案在DOMXPATH中,但我不理解它。可能是重复的,我已经看过了。看起来导入节点的方法正是我所需要的,但如果我理解得很好,他并没有将导入的节点附加到existen XML的特定标记上。我认为解决方案在DOMPATH中,但我不理解它。我已经看到了它的可能重复。看起来导入节点的方法正是我所需要的,但如果我理解得很清楚的话,他并没有将导入的节点附加到existen XML的特定标记上!我经常使用XSLT:-)很抱歉让一个XSLT程序员哭了,但它对我起了作用:)在某个地方,一个XSLT程序员哭了一点!我经常使用XSLT:-)很抱歉让一个XSLT程序员哭了,但它对我起了作用:)
<?xml version="1.0" encoding="UTF-8"?>
<root>
<base1>
<item1>FOO</item1>
<item2>BAR</item2>
<base2>
<back>
<root>
<element>
<back>
<item1>ABC</item1>
<item2>DEF</item2>
<more>
<moreitem>GHI</moreitem>
</more>
</back>
</element>
</root>
</back>
</base2>
</base1>
</root>