doupin5408 2016-09-02 13:38
浏览 24

如何合并具有相同属性的XML元素?

I was wondering if is able to merge the following XML data on example.php file:

<?xml version="1.0" encoding="UTF-8"?>
<elevate>
 <query text="foo bar">
 <doc id="1"/>
 <doc id="2"/>
 <doc id="3"/>
</query>

<query text="foo bar">
 <doc id="4"/>
 <doc id="9"/>
 <doc id="3"/>
</query>
<elevate>

The result would be something like this:

<query text="foo bar">
 <doc id="1"/>
 <doc id="2"/>
 <doc id="3"/>
 <doc id="4"/>
 <doc id="9"/>
</query>
  • 写回答

2条回答 默认 最新

  • duanshan3331 2016-09-02 13:58
    关注

    You could loop through the elements and create a "new" xml. Something like this?

    $xml = <<<EOF
    <?xml version="1.0" encoding="UTF-8"?>
    <elevate>
        <query text="foo bar">
            <doc id="1"/>
            <doc id="2"/>
            <doc id="3"/>
        </query>
    
        <query text="foo bar">
             <doc id="4"/>
             <doc id="9"/>
             <doc id="3"/>
        </query>
    
        <query text="foo bar">
             <doc id="4"/>
             <doc id="8"/>
             <doc id="3"/>
        </query>
    </elevate>
    EOF;
    
    $parsed = simplexml_load_string($xml);
    
    $docs = [];
    
    foreach ($parsed->query as $query) {
        foreach ($query->doc as $doc) {
            foreach ($doc->attributes() as $attribute) {
                // you should do some checking here, like in_array to make sure there is no duplicates.
                // we use __toString so it puts it as a string, not an XmlElement object
                $docs[] = $attribute[0]->__toString();
            }
        }
    }
    
    $docsXml = '';
    foreach ($docs as $doc) {
        $docsXml .= '<doc id="' . $doc .'" />' . PHP_EOL;
    }
    
    $newXml = <<<EOF
    <?xml version="1.0" encoding="UTF-8"?>
    <elevate>
        <query text="foo bar">
         $docsXml
        </query>
    </elevate>
    EOF;
    
    echo $newXml;
    

    Which outputs

    <?xml version="1.0" encoding="UTF-8"?>
    <elevate>
        <query text="foo bar">
            <doc id="1" />
            <doc id="2" />
            <doc id="3" />
            <doc id="4" />
            <doc id="9" />
            <doc id="3" />
            <doc id="4" />
            <doc id="8" />
            <doc id="3" />
    
        </query>
    </elevate>
    
    评论

报告相同问题?

悬赏问题

  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟