使用PHP删除XLF中的重复项

使用PHP删除XLF中的重复项,php,xml,Php,Xml,我有一个XML文件,我想用PHP检查是否有任何重复的条目,并删除不必要的条目。 Im运行所有trans单元,将id推入数组并检查数组中是否已经存在该条目。 但是,如果我发现一个已经存在的id,如何删除trans单元 我的XLF和PHP代码: <?xml version="1.0" encoding="utf-8" standalone="yes"?> <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" ver

我有一个XML文件,我想用PHP检查是否有任何重复的条目,并删除不必要的条目。 Im运行所有trans单元,将id推入数组并检查数组中是否已经存在该条目。 但是,如果我发现一个已经存在的id,如何删除trans单元

我的XLF和PHP代码:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
        <file source-language="de" target-language="de" datatype="plaintext" original="messages" date="2018-08-24T14:49:31Z" product-name="test">
            <header/>
            <body>
                <trans-unit id="test">
                    <source>123</source>
                    <target/>
                </trans-unit>
                <trans-unit id="test2">
                   <source>123</source>
                   <target/>
                </trans-unit>
                <trans-unit id="test2">
                   <source>123</source>
                   <target/>
                </trans-unit>
                <trans-unit id="test3">
                   <source>123</source>
                   <target/>
                </trans-unit>
                <trans-unit id="test4">
                   <source>123</source>
                   <target/>
                </trans-unit>
            </body>
        </file>
    </xliff>


    function cleanUpXliffFile($file) {
        $transUnitIds = [];
        $xlif = simplexml_load_file($file);
        $xlif->file['source-language'] = "de";
        foreach($xlif->file->body->{'trans-unit'} as $item) {
            $unit = $item->attributes()->id;
            $transUnitId = $unit[0]->__toString();
            if(in_array($transUnitId, $transUnitIds)) {
                //DELETE THE CHILD
            }
            $transUnitIds[] = $transUnitId;
            if (!isset($item->target)) {
                $item->addChild("target");
            }

            if ($item->target->__toString() !== "") {
                $item->source = (string)$item->target;
                $item->target[0] = "";
            }
        }

        $xlif->saveXML($file);
    }

123
123
123
123
123
函数cleanUpXliffFile($file){
$transUnitIds=[];
$xlif=simplexml\u加载文件($file);
$xlif->file['source-language']=“de”;
foreach($xlif->file->body->{'trans-unit'}作为$item){
$unit=$item->attributes()->id;
$transUnitId=$unit[0]->_-toString();
if(在数组中($transUnitId,$transUnitId)){
//删除孩子
}
$transUnitIds[]=$transUnitId;
如果(!isset($item->target)){
$item->addChild(“目标”);
}
如果($item->target->\uuu-toString()!=“”){
$item->source=(字符串)$item->target;
$item->target[0]=“”;
}
}
$xlif->saveXML($file);
}

一个非常简单的小函数,使用
DOMDocument
而不是
simplexml
似乎可以正常工作。获取对
trans-unit
节点的引用,如果该ID以前不存在,则将其添加到数组中,并使用
removeChild
删除重复的节点。这不会对
target
属性进行额外的伪造

function cleanXMLFile( $file ){
    $dom=new DOMDocument;
    $dom->load( $file );

    $tmp=[];
    $col=$dom->getElementsByTagName( 'trans-unit' );

    foreach( $col as $node ){
        if( !array_key_exists( $node->getAttribute('id'), $tmp ) ) $tmp[ $node->getAttribute('id') ]=$node;
        else $node->parentNode->removeChild( $node );
    }

    $dom->save( $file );
}

cleanXMLFile( __DIR__ . '/xlf.xml' );