使用PHP删除XLF中的重复项
我有一个XML文件,我想用PHP检查是否有任何重复的条目,并删除不必要的条目。 Im运行所有trans单元,将id推入数组并检查数组中是否已经存在该条目。 但是,如果我发现一个已经存在的id,如何删除trans单元 我的XLF和PHP代码:使用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 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' );