【问题标题】:Separating XML products by Category in PHP在 PHP 中按类别分离 XML 产品
【发布时间】:2016-02-02 07:32:18
【问题描述】:

我在 PHP 中读取了一个 XML 文件

$xml=simplexml_load_file("./files/downloaded.xml");

此文件包含许多不同类别的产品。 我想根据它们的类别将它们分开。 下面是通过以下代码读取文件视图的样子。

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

我用以下代码分隔产品

$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>";

现在我想将它保存为 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 代码分开?

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

【问题讨论】:

  • 请编辑您的问题并键入 xml 的相关部分,而不是链接图像。外部服务器上的图片以后可能会被删除,到时候你的问题对其他开发者就没用了。
  • 是的,请发布实际的 xml 或 php 输出。想帮忙,但这里没有可重现的例子。

标签: php json xml


【解决方案1】:

操作原始的SimpleXml 对象,而不是创建一个数组。
然后用$xml-&gt;asXML($filename);另存为XML

使用xpath 选择具有某个&lt;category&gt;&lt;product&gt; 节点。 xpath 就像 XML 的 SQL:

/products/product[starts-with(category, 'Foo > Bar >')] 

评论:

  • 表达式将返回所有&lt;product&gt;,其中&lt;category&gt;"Foo &gt; Bar &gt;"开头
  • [] 包含一个条件。
  • 您可以使用contains 函数代替start-with

代码示例:

$products = $xml->xpath("/products/product[starts-with(category, 'Foo > Bar >')]");

但是 $productsSimpleXml 元素的数组,但没有 SimpleXml 对象,所以 asXML() 在这里不起作用。

解决方案 1:

  • 选择所需类别中所有 NOT&lt;product&gt;
  • $xml中删除那些
  • asXML()保存

代码示例:

$products = $xml->xpath("/products/product[not(starts-with(category, 'Foo > Bar >'))]");

foreach ($products as $product)
    unset($product[0]);

这是删除带有unset 的节点的自引用技术

显示被操纵的 XML:

echo $xml->asXML();

看到它的工作:https://eval.in/512140

解决方案 2

使用原始的 $products 并从中构建一个新的 XML 字符串。

foreach ($products as $product) 
    $newxmlstr = $newxmlstr . $product->asXML();

$newxmlstr = "<products>" . $newxmlstr . "</products>";

看到它的工作:https://eval.in/512153

我更喜欢解决方案 1。通过字符串函数进行 XML 操作存在出错的风险。如果原始 XML 真的很大,解决方案 2 可能会更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2013-04-20
    相关资源
    最近更新 更多