在PHP中按类别分隔XML产品

时间:2016-02-02 07:32:19

标签: php json xml

我通过

读取PHP中的XML文件
$xml=simplexml_load_file("./files/downloaded.xml");

此文件包含许多具有不同类别的产品。 我想根据他们的类别将它们分开。 以下是代码的读取文件视图外观。

print "<pre>";
print_r($xml);
print "</pre>";

enter image description here

我通过以下代码分隔产品

$baby = array();
for($x=0;$x < count($xml->product); $x++)
  {
      if( preg_match("#Groceries > ([ a-zA-Z0-9]+) >#i",$xml->product[$x]->category,$match) )
      {
        $match[1] = str_replace(" ", "" , strtolower($match[1]) );
        if($match[1] == "baby"){
            $baby[] = $xml->product[$x];
        }

      }
  }

它已在一个名为$ baby的数组中分隔,这里是以下代码的婴儿数组视图

print "<pre>";
print_r($baby);
print "</pre>";

enter image description here 现在我想把它保存为baby.xml和baby.json文件,但我不知道如何保存它。 我试过这段代码来保存这些文件

$baby_json = simplexml_load_string($baby);
$json = json_encode($baby_json);
file_put_contents("./files/foodcupobard.json",$json);
file_put_contents("./files/foodcupobard.xml",$baby);

但分离后它无法正常工作。 这是在分离之前工作的代码

$xml=simplexml_load_file("./files/downloaded.xml");
$xml_json = simplexml_load_string($xml);
$json = json_encode($xml_json);
file_put_contents("./files/baby.json",$json);
file_put_contents("./files/baby.xml",$xml);

分离后不工作的原因是分离后{$ baby}成为数组而不是SimpleXMLElement对象。任何人都可以帮我将这些分离的产品保存到baby.xml和baby.json文件中吗?或用PHP代码分隔这些产品的任何其他方式?

任何帮助将不胜感激! 谢谢:))

1 个答案:

答案 0 :(得分:1)

操纵原始SimpleXml对象,而不是创建数组 然后使用$xml->asXML($filename);

保存为XML

使用xpath选择具有特定<product>的{​​{1}}个节点。 <category>就像SQL for XML:

xpath

评论:

  • 表达式将返回/products/product[starts-with(category, 'Foo > Bar >')] <product>开头的所有<category>
  • "Foo > Bar >"附上条件。
  • 您可以使用[]功能代替contains

代码示例:

start-with

但是 $products = $xml->xpath("/products/product[starts-with(category, 'Foo > Bar >')]"); $products个元素的数组,但没有SimpleXml个对象,所以SimpleXml在这里不起作用。

解决方案1:

  • 选择所需类别中 asXML() 的所有<product>
  • NOT
  • 中删除这些内容
  • 使用$xml
  • 保存

代码示例:

asXML()

这是使用$products = $xml->xpath("/products/product[not(starts-with(category, 'Foo > Bar >'))]"); foreach ($products as $product) unset($product[0]); 删除节点的自引用技术

显示被操纵的XML:

unset

看到它有效:https://eval.in/512140

解决方案2

使用原始echo $xml->asXML(); 并从中构建新的XML字符串。

$products

看到它有效:https://eval.in/512153

我更喜欢解决方案1.字符串函数的XML操作存在错误风险。如果原始XML非常大,那么解决方案2可能会更快。