【问题标题】:Compare and filter two xml files in php比较和过滤php中的两个xml文件
【发布时间】:2023-03-15 09:25:02
【问题描述】:

我想比较 PHP 中的两个 xml 文件(实际上是逐个过滤),一个 xml 文件包含例如“接口”数据,另一个包含接口(rule.xml),但元素较少,正是我想要的,并且想要获取两个xmls中的过滤数据。

第一个xml:

`<?xml version="1.0" encoding="UTF-8"?>
<data>
  <interfaces>
    <interface>
        <name><!-- type: string --></name>
        <type><!-- type: string --></type>
        <mtu><!-- type: int32 --></mtu>
    <interface>
</interfaces>
</data>`

第二个xml:

`<?xml version="1.0" encoding="UTF-8"?>
<data>
  <interfaces>
    <interface>
      <name>interfacename</name>
      <type>gigaeth</type>
      <mtu>1500</mtu>
      <counters>
        <inBytes>17800</inBytes>
        <inPackets>156000</inPackets>
        <inErrors>850</inErrors>
      </counters>
    </interface>
  </interfaces>
</data>`

所以我想要的结果是:

`<?xml version="1.0" encoding="UTF-8"?>
<data>
  <interfaces>
    <interface>
      <name>interfacename</name>
      <type>gigaeth</type>
      <mtu>1500</mtu>
   </interface>
  </interfaces>
</data>`

【问题讨论】:

  • 嗨,您看过 XML 模式和 DTD 吗?
  • 我真的不明白你在这里想要达到什么目的。您想要来自第二个 xml 的数据,但元素较少? (跳过counters 标签?)如果可能请详细说明。
  • 是的,我想通过第一个 xml 过滤第二个并保留相似的标签。

标签: php xml xmldiff


【解决方案1】:

使用 simplexml 以递归方式同步遍历两个 xml 树。在第一个 xml 的叶节点检查第二个中是否存在相同的节点并更改值

$xml1 = new SimpleXMLElement($str1);
$xml2 = new SimpleXMLElement($str2);

function set(&$xml, $xml2) {
    foreach($xml as $key => $xmlpos) {
        if (isset($xml2->$key))
          if($xmlpos->count()) set($xmlpos, $xml2->$key);
          else  $xml->$key =  $xml2->$key;
    }
}

set($xml1, $xml2);
echo $xml1->saveXML(); 

【讨论】:

  • 只是一个关于如何让函数与预先生成的 xml1 和 xml2 一起工作的问题?换句话说,我已经有了这两个 xml 文件。我怎么称呼他们?
  • set($xml1, $xml2); 不是你问的吗?
  • smthg like : set('../../file1.xml', '../../file2.xml')
  • 没有。试试$xml1 = new SimpleXMLElement($url1,,true); 一定能用,但我没用过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
相关资源
最近更新 更多