这是我的类别XML文件。 类别级别从上到下:
<categories>
<category>
<category id="17" name="Off-Road" />
<category id="141" name="HPI - Maverick" />
<category id="453" name="HSP" />
<category id="412" name="Diger" />
</category>
<category>
<category id="124" name="Benzinli" />
<category id="125" name="Off-Road" />
<category id="295" name="MCD Racing" />
<category id="315" name="RTR" />
<category id="316" name="Kit Versiyonları" />
</category>
</categories>
这是我的产品 XML 文件。只有类别 ID:
<products>
<product>
<id>001300V4</id>
<name>MCD RRV4 Competition - No Engine</name>
<price>1049</price>
<stock>2</stock>
<currency>Euro</currency>
<brand>MCD Racing</brand>
<description>
<![CDATA[......]]> ]]>
</description>
<categories>
<category>316</category>
</categories>
</product>
如何将这两个文件合并并仅转换一个xml文件?请帮助我。谢谢。
我需要最终的 xml :
<products>
<product>
<id>001300V4</id>
<name>MCD RRV4 Competition - No Engine</name>
<price>1049</price>
<stock>2</stock>
<currency>Euro</currency>
<brand>MCD Racing</brand>
<description><![CDATA[......]]></description>
<categories>
<category>Benzinli</category>
<category>Off-Road</category>
<category>MCD Racing</category>
<category>Kit Versiyon</category>
</categories>
</product>
</products>
使用 DOMDocument 和 DOMXPath,您可以尝试以下脚本:
/* Init DOMDocuments: */ #01
$categories = new DOMDocument();
$product = new DOMDocument();
/* Load XML: */
$categories ->loadXML( $xml1, LIBXML_NOBLANKS );
$product ->loadXML( $xml2, LIBXML_NOBLANKS );
$categories ->formatOutput = True;
$product ->formatOutput = True;
/* Init xPath: */
$xPathCat = new DOMXPath( $categories );
$xPathProd = new DOMXPath( $product );
/* Search Product Category: */ #02
$prodCat = $xPathProd->query( '/products/product/categories/category' );
if( $prodCat->length > 0 ) #03
{
$cat = $prodCat->item(0);
/* Search Corresponding Category in Categories: */ #04
$found = $xPathCat->query
( "/categories/category/category[@id='"{$cat->nodeValue}'"]" );
if( $found->length )
{
foreach( $found->item(0)->parentNode->childNodes as $child ) #05
{
/* Append ChildNode <category>Category Name</category>: */
$cat->parentNode->appendChild
(
$product->createElement( 'category', $child->getAttribute( 'name' ) )
);
}
/* Remove Old Category (numeric): */ #06
$cat->parentNode->removeChild( $cat );
}
}
echo $product->saveXML().PHP_EOL;
3v4l.org 演示
我们为类别创建一个
DOMDocument
,为产品创建一个; 然后我们加载相应的 XML(你必须用你的变量名更改$xml1
和$xml2
;如果你想直接从文件加载它,你必须使用->load( filePath )
而不是->loadXML( var )
(; 最后,我们初始化两个DOMXPath
来执行简单的查询;我们执行 xPath 查询以查找产品 xml 中
/products/product/categories/category
的节点;如果查询成功,我们将处理第一个类别项(此脚本最终省略了其他类别项,尽管可以使其适应多个类别项(,并且
我们执行 xPath 查询以在类别 xml (
category[@id=
中找到产品类别 ID ;如果查询成功,我们处理每个类别节点同级,检索他在新
<category>
产品元素的节点值中使用的属性"name",然后将这个新元素附加到实际<category>
产品元素的最后一个同级;在
foreach
循环之后,我们删除原始的数字<category>
产品元素并打印出生成的 XML。
- 查看有关文档对象模型的详细信息
- 查看更多关于 DOMXPath 的信息
编辑:
您的类别文件与提供的示例不同。此外,正如您在上面的 §3 中看到的,我的脚本仅适用于第一个产品类别匹配。要正确运行文件,请按以下方式更改上述脚本:
(...)
/* Search Product Category: */
foreach( $xPathProd->query( '/products/product/categories' ) as $node )
{
$prodCat = $xPathProd->query( './category', $node );
if( $prodCat->length > 0 )
{
$cat = $prodCat->item(0);
$found = $xPathCat->query( "//category[@id='"{$cat->nodeValue}'"]" );
if( $found->length )
{
foreach( $found->item(0)->parentNode->childNodes as $child )
{
/* Append ChildNode <category>Category Name</category>: */
$cat->parentNode->appendChild
(
$product->createElement( 'category', htmlspecialchars($child->getAttribute( 'name' )) )
);
}
/* Remove Old Category (numeric): */
$cat->parentNode->removeChild( $cat );
}
}
}