代码之家  ›  专栏  ›  技术社区  ›  Cudos

合并XMLfile中的条目(PHP中的SimpleXML)

  •  0
  • Cudos  · 技术社区  · 14 年前

    我的XML文件中有这个:

    <product name="iphone">
        <variant name="iphone" product_number="12345" price="500" picture="iphone.jpg">
            <description><![CDATA[iphone]]></description>
            <short_description><![CDATA[]]></short_description>
            <deliverytime><![CDATA[]]></deliverytime>
            <options>
                <option group="Color" option="Black" />
            </options>
        </variant>
    </product>
    <product name="iphone">
        <variant name="iphone" product_number="12345" price="500" picture="iphone.jpg">
            <description><![CDATA[iphone]]></description>
            <short_description><![CDATA[]]></short_description>
            <deliverytime><![CDATA[]]></deliverytime>
            <options>
                <option group="Color" option="White" />
            </options>
        </variant>
    </product>
    

    我想把它合并成这个(注意我合并了options标签):

    <product name="iphone">
        <variant name="iphone" product_number="12345" price="500" picture="iphone.jpg">
            <description><![CDATA[iphone]]></description>
            <short_description><![CDATA[]]></short_description>
            <deliverytime><![CDATA[]]></deliverytime>
            <options>
                <option group="Color" option="Black" />
                <option group="Color" option="White" />
            </options>
        </variant>
    </product>
    

    最好我想在记忆中做这一切,因为以后我会进一步处理它。

    1 回复  |  直到 12 年前
        1
  •  0
  •   rokdd    14 年前

    这不容易,我正在寻找同样的。。。其中一个问题是识别哪个iphone是什么意思等等。。虽然存在合并功能,但在我的案例中,它们都不能很好地工作: http://www.php.net/manual/de/ref.simplexml.php#92272 当你还没有找到解决办法的时候,我想是时候亲自去做并向你报告:

    更新1: 功能 xml_attribute addxmlelement 都是从普通的php页面(和我复制到最后)。我写的函数是非常个别的一个案例,并不是适用于所有的合并情况。我为我创作了一部小说。

    XML:Neu(新增)

    <varrDaten>
            <person>
            <street id="adder">adder</street>
            <loc>land AAA</loc>
        </person>
        <person>
            <street id="exister">exister street</street>
            <loc>land gg</loc>
        </person>
        <person>
            <street id="updater">street is uptodate</street>
            <loc>land is updated</loc>
        </person>
    </varrDaten>
    

    <varrDaten>
        <person>
            <street id="minuser">minuser</street>
            <loc>land 0</loc>
        </person>
        <person>
            <street id="exister">exister street</street>
            <loc>land lon</loc>
        </person>
        <person>
            <street id="updater">update need street</street>
            <loc>land need update</loc>
        </person>
    </varrDaten>
    

    function simplexml_merge2($xpOld,$xpNeu)
                {
                $selIDS=$xpNeu->xpath('//street[not(@id="0")]');
                foreach($selIDS as $ident)
                    {
                    //existiert in vorhandennen?
                    $xpSelV=$xpOld->xpath('//person/street[@id="'.xml_attribute($ident,'id').'"]');
                    if(count($xpSelV)>0)
                        {
                        echo "YES EXISTS".(string)$xpSelV[0][0]."<>".(string)$ident[0]."
    "; //test of value maybe.. if(!((string)$xpSelV[0][0]==(string)$ident[0])) { //HERE YOU CAN ADD CRITERIA WHICH SHOULD BE SYCNRONISED IF ALREADY EXISTS echo "VAL not the same"; $xp2Ef=$xpOld->xpath('//person[./street[@id="'.xml_attribute($ident,'id').'"]]'); $xp2Ef[0][0]=(string)$ident[0]; } } else { echo "NOOO:".$xpNeu[0]; $xpEF=$xpOld->xpath('//varrDaten'); echo '//person[./street[@id="'.xml_attribute($ident,'id').'"]]'; $xp2Ef=$xpNeu->xpath('//person[./street[@id="'.xml_attribute($ident,'id').'"]]'); AddXMLElement($xpEF[0],$xp2Ef[0]); } } }
    添加。函数
    function xml_attribute($object, $attribute)
    {
        if(isset($object[$attribute]))
            return (string) $object[$attribute];
        else
            return false;
    }
     function AddXMLElement(SimpleXMLElement $dest, SimpleXMLElement $source)
        {
            $new_dest = $dest->addChild($source->getName(), $source[0]);
    
    
        foreach ($source->attributes() as $name => $value)
        {
            $new_dest->addAttribute($name, $value);
        }
    
        foreach ($source->children() as $child)
        {
            AddXMLElement($new_dest, $child);
        }
    }