如何分类和产品XML文件组合


How to Categoriy and Product XML files combined

这是我的类别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 演示

  1. 我们为类别创建一个DOMDocument,为产品创建一个; 然后我们加载相应的 XML(你必须用你的变量名更改$xml1$xml2;如果你想直接从文件加载它,你必须使用 ->load( filePath ) 而不是 ->loadXML( var ) (; 最后,我们初始化两个DOMXPath来执行简单的查询;

  2. 我们执行 xPath 查询以查找产品 xml 中/products/product/categories/category的节点;

  3. 如果查询成功,我们将处理第一个类别项(此脚本最终省略了其他类别项,尽管可以使其适应多个类别项(,并且

  4. 我们执行 xPath 查询以在类别 xml ( category[@id= 中找到产品类别 ID ;

  5. 如果查询成功,我们处理每个类别节点同级,检索他在新<category>产品元素的节点值中使用的属性"name",然后将这个新元素附加到实际<category>产品元素的最后一个同级;

  6. 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 );
        }
    }
}