如何使用php将Document-A XML节点更新为Document-B XML节点
我有两个XML文件:一个来自客户端,另一个来自db查询。db XML文件具有以下结构:如何使用php将Document-A XML节点更新为Document-B XML节点,php,xml,Php,Xml,我有两个XML文件:一个来自客户端,另一个来自db查询。db XML文件具有以下结构: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <tags> <title>Wordsleuth (2006, volume 3, 4): The
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<tags>
<title>Wordsleuth (2006, volume 3, 4): The Dictionary: Disapproving Schoolmarm or Accurate Record?</title>
<alias>favart/wordsleuth-2006-volume-3-4-the-dictionary-disapproving-schoolmarm-or-accurate-record</alias>
<id>4361</id>
</tags>
</metadata>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<tags>
<title>Wordsleuth (2006, vol. 3, 4): The Dictionary: Disapproving Schoolmarm or Accurate Record? – Search by Title – Favourite Articles – TERMIUM Plus® – Translation Bureau</title>
<description>A Language Update article on the role that the dictionary plays in language usage.</description>
<keywords>language usage; dictionaries</keywords>
<subject>English language; Terminology</subject>
</tags>
</metadata>
此代码运行,不生成错误,并且不执行任何操作。结尾的附和陈述
echo "\n\n" . "THE TOTAL NUMBER OF MATCHES EQUALS " . $i . " IN " . $j . " NODES." . "\n";
生成此消息:
匹配的总数等于1个节点中的1个
第二种更简单的方法是:
$client = 'C:\xampp\htdocs\wetkit\sites\all\modules\my_metatags\favart.xml';
$db = 'C:\xampp\htdocs\wetkit\sites\all\modules\my_metatags\tmp\from db\favart_db.xml';
$c_xmlstr = file_get_contents($client);
$d_xmlstr = file_get_contents($db);
$favartdoc_db = new DomDocument('1.0','UTF-8');
$favartdoc_cl = new DomDocument('1.0','UTF-8');
$favartdoc_db->loadXML($d_xmlstr);
$favartdoc_cl->loadXML($c_xmlstr);
for ($i=0;$i==$favartdoc_cl->getElementsByTagName('title')->count; $i++){
$c_nodes = $x_favartdoc_cl->query('/metadata/tags/title');
$c_node = $c_nodes->item($i);
for ($j=0; $j==$favartdoc_db->getElementsByTagName('title')->count; $j++){
$d_nodes = $x_favartdoc_db->query('/metadata/tags/title');
$d_node = $d_nodes->item($j);
if(stripos(trim($c_node->nodeValue), trim($d_node->nodeValue))===0){
$favartdoc_cl->replaceChild($d_node,$c_node);
if($i==($c_nodes->count)){break;};
}
}
$favartdoc_cl->saveXML();
}
$favartdoc_db = new DomDocument('1.0','UTF-8');
$favartdoc_cl = new DomDocument('1.0','UTF-8');
$favartdoc_db->load($db);
$favartdoc_cl->load($client);
$favartdoc_cl->formatOutput = true;
$c_meta_x = new DOMXpath($favartdoc_cl);
$d_meta_x = new DOMXpath($favartdoc_db);
foreach ($c_meta_x->query('//tags') as $c_tag){
foreach ($d_meta_x->query('//tags') as $d_tag){
if(strncasecmp(trim($c_tag->title), trim($d_tag->title) , strlen(trim($d_tag->title)))===0){
$c_tag->appendChild($d_tag);
}
}
}
$favartdoc_cl->saveXML();
但这会产生一个错误:
异常“DomeException”,消息为“错误文档错误”
在将importNode附加到DOM之前,通过调用importNode来更正该错误的建议仍然会生成相同的错误
正如你所看到的,我在每个函数中尝试了不同的字符串匹配函数。最后,我想用db中的标题替换客户机XML中的标题,或者将db XML中的整个标记集附加到客户机XML中,然后删除客户机标题元素
任何帮助都将不胜感激。这正是我所需要的
$client = 'some\where\somefile.xml';
$db = 'some\where\someOtherfile.xml';
$c_xmlstr = file_get_contents($client);
$d_xmlstr = file_get_contents($db);
$doc_db = new DomDocument('1.0','UTF-8');
$doc_cl = new DomDocument('1.0','UTF-8');
$doc_db->loadXML($d_xmlstr);
$fdoc_cl->loadXML($c_xmlstr);
$x_doc_db = new DOMXpath($doc_db);
$x_doc_cl = new DOMXpath($doc_cl);
$c_nodes = $x_doc_cl->query('/metadata/tags');
$c_nodes_titles = $x_doc_cl->query('/metadata/tags/title');
for($i=0;$i<=$c_nodes->length;++$i){
$c_node = $c_nodes->item($i);
$c_node_title = $c_nodes_titles->item($i);
$d_nodes = $x_doc_db->query('/metadata/tags');
$d_nodes_titles = $x_doc_db->query('/metadata/tags/title');
$d_nodes_ids = $x_doc_db->query('/metadata/tags/id');
for($j=0;$j<=$d_nodes->length;++$j){
$d_node_title = $d_nodes_titles->item($j);
$d_node_id = $d_nodes_ids->item($j);
if(strncasecmp(trim($c_node_title->textContent),trim($d_node_title->textContent) , strlen(trim($d_node_title->textContent)))===0 && trim($c_node_title->textContent)===trim($d_node_title->textContent)){
$db_id = $doc_cl->createElement("db_id");
$db_id_val = $doc_cl->createTextNode($d_node_id->nodeValue);
if(!is_null($c_node)){$c_node->appendChild($db_id);}
if(!is_null($c_node)){$c_node->appendChild($db_id_val);}
}
}
if($i===($c_nodes->count) && $j===($d_nodes->count)){break;};
}
$doc_cl->saveXML();
$client='some\where\somefile.xml';
$db='some\where\someOtherfile.xml';
$c_xmlstr=文件获取内容($client);
$d_xmlstr=文件获取内容($db);
$doc_db=新的DomDocument('1.0','UTF-8');
$doc_cl=新的DomDocument('1.0','UTF-8');
$doc_db->loadXML($d_xmlstr);
$fdoc_cl->loadXML($c_xmlstr);
$x_doc_db=新的DOMXpath($doc_db);
$x_doc_cl=新的DOMXpath($doc_cl);
$c_nodes=$x_doc_cl->query('/metadata/tags');
$c_nodes_titles=$x_doc_cl->query('/metadata/tags/title');
对于($i=0;$i长度;++$i){
$c_node=$c_nodes->item($i);
$c_节点_标题=$c_节点_标题->项目($i);
$d_nodes=$x_doc_db->query('/metadata/tags');
$d_nodes_titles=$x_doc_db->query('/metadata/tags/title');
$d_nodes_id=$x_doc_db->query('/metadata/tags/id');
对于($j=0;$jlength;++$j){
$d_node_title=$d_node_titles->item($j);
$d_node_id=$d_nodes_id->item($j);
如果(strncasecmp(trim($c\u node\u title->textContent)、trim($d\u node\u title->textContent)、strlen(trim($d\u node\u title->textContent))==0&&trim($c\u node\u title->textContent)==trim($d\u node\u title->textContent)){
$db_id=$doc_cl->createElement(“db_id”);
$db_id_val=$doc_cl->createTextNode($d_node_id->nodeValue);
如果(!is_null($c_node)){$c_node->appendChild($db_id);}
如果(!is_null($c_node)){$c_node->appendChild($db_id_val);}
}
}
如果($i==($c_节点->计数)和($j==($d_节点->计数)){break;};
}
$doc_cl->saveXML();
这对我来说很有用
$client = 'some\where\somefile.xml';
$db = 'some\where\someOtherfile.xml';
$c_xmlstr = file_get_contents($client);
$d_xmlstr = file_get_contents($db);
$doc_db = new DomDocument('1.0','UTF-8');
$doc_cl = new DomDocument('1.0','UTF-8');
$doc_db->loadXML($d_xmlstr);
$fdoc_cl->loadXML($c_xmlstr);
$x_doc_db = new DOMXpath($doc_db);
$x_doc_cl = new DOMXpath($doc_cl);
$c_nodes = $x_doc_cl->query('/metadata/tags');
$c_nodes_titles = $x_doc_cl->query('/metadata/tags/title');
for($i=0;$i<=$c_nodes->length;++$i){
$c_node = $c_nodes->item($i);
$c_node_title = $c_nodes_titles->item($i);
$d_nodes = $x_doc_db->query('/metadata/tags');
$d_nodes_titles = $x_doc_db->query('/metadata/tags/title');
$d_nodes_ids = $x_doc_db->query('/metadata/tags/id');
for($j=0;$j<=$d_nodes->length;++$j){
$d_node_title = $d_nodes_titles->item($j);
$d_node_id = $d_nodes_ids->item($j);
if(strncasecmp(trim($c_node_title->textContent),trim($d_node_title->textContent) , strlen(trim($d_node_title->textContent)))===0 && trim($c_node_title->textContent)===trim($d_node_title->textContent)){
$db_id = $doc_cl->createElement("db_id");
$db_id_val = $doc_cl->createTextNode($d_node_id->nodeValue);
if(!is_null($c_node)){$c_node->appendChild($db_id);}
if(!is_null($c_node)){$c_node->appendChild($db_id_val);}
}
}
if($i===($c_nodes->count) && $j===($d_nodes->count)){break;};
}
$doc_cl->saveXML();
$client='some\where\somefile.xml';
$db='some\where\someOtherfile.xml';
$c_xmlstr=文件获取内容($client);
$d_xmlstr=文件获取内容($db);
$doc_db=新的DomDocument('1.0','UTF-8');
$doc_cl=新的DomDocument('1.0','UTF-8');
$doc_db->loadXML($d_xmlstr);
$fdoc_cl->loadXML($c_xmlstr);
$x_doc_db=新的DOMXpath($doc_db);
$x_doc_cl=新的DOMXpath($doc_cl);
$c_nodes=$x_doc_cl->query('/metadata/tags');
$c_nodes_titles=$x_doc_cl->query('/metadata/tags/title');
对于($i=0;$i长度;++$i){
$c_node=$c_nodes->item($i);
$c_节点_标题=$c_节点_标题->项目($i);
$d_nodes=$x_doc_db->query('/metadata/tags');
$d_nodes_titles=$x_doc_db->query('/metadata/tags/title');
$d_nodes_id=$x_doc_db->query('/metadata/tags/id');
对于($j=0;$jlength;++$j){
$d_node_title=$d_node_titles->item($j);
$d_node_id=$d_nodes_id->item($j);
如果(strncasecmp(trim($c\u node\u title->textContent)、trim($d\u node\u title->textContent)、strlen(trim($d\u node\u title->textContent))==0&&trim($c\u node\u title->textContent)==trim($d\u node\u title->textContent)){
$db_id=$doc_cl->createElement(“db_id”);
$db_id_val=$doc_cl->createTextNode($d_node_id->nodeValue);
如果(!is_null($c_node)){$c_node->appendChild($db_id);}
如果(!is_null($c_node)){$c_node->appendChild($db_id_val);}
}
}
如果($i==($c_节点->计数)和($j==($d_节点->计数)){break;};
}
$doc_cl->saveXML();
虽然这是创建元素并将其插入我期望的位置的工作代码,但我并不幻想有人可以编写更优雅的解决方案。尽管这是创建元素并将其插入我期望的位置的工作代码,我也不幻想有人可以编写更优雅的解决方案。