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中的XML克隆节点_Php_Xml_Clone_Domdocument - Fatal编程技术网

PHP中的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

我必须克隆一个XML节点及其子节点,并将其附加到specifics标记中的新XML中

即:

源XML:

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