【问题标题】:Combine multiple XML from JSON convertion从 JSON 转换组合多个 XML
【发布时间】:2018-02-22 07:39:58
【问题描述】:

我正在以 JSON 格式从 API 收集数据并将其转换为 XML。现在无法一次收集所有数据,因此我一次只能获得 100 个项目,并将每个 JSON 响应转换为 XML,并为每个项目创建一个单独的文件。 我正在使用变量 $i 为 JSON 增加 Page 并使用它为 XML 创建一个文件。

主要的重要数据都在里面,所以如果可能的话,我只想将这些数据添加到 xml 文件中。

function arrayToXml($array, &$xml){

    foreach($array as $key => $value) {

      if(is_array($value)) {
        if(!is_numeric($key)){
            $subnode = $xml->addChild("$key");
            arrayToXml($value, $subnode);
        }else{
            $subnode = $xml->addChild("item$key");
            arrayToXml($value, $subnode);
        }
    }else {

        $xml->addChild("$key",htmlspecialchars("$value"));
    }
}

}

$file=curl_exec($ch);

$array = json_decode ($file, true);
$xml = new SimpleXMLElement('<root/>');
arrayToXml($array, $xml);
$result = $xml->asXML($i.'name.xml');

<results>
<item0>
<_class>course</_class>
<id>364426</id>
<title>JavaScript: Understanding the Weird Parts</title>
<url>/understand-javascript/</url>
   
<headline>
An advanced JavaScript course for everyone! Scope, closures, prototypes, 'this', build your own framework, and more.
</headline>
<num_subscribers>100604</num_subscribers>
<avg_rating>4.77</avg_rating>
<num_reviews>23000</num_reviews>
<num_lectures>85</num_lectures>
<primary_subcategory>
<id>8</id>
<_class>course_subcategory</_class>
<title>Web Development</title>
</primary_subcategory>
<predictive_score/>
<relevancy_score>1.0704279</relevancy_score>
<input_features/>
<lecture_search_result/>
</item0>

<root>
<count>8373</count>
<next>...</next>
<previous/>
<results>...</results>
<aggregations>...</aggregations>
</root>

简而言之,我想要一个 XML 文件中的每次迭代的数据,并且如果可能的话,只需要包含关键结果及其子项的数据。如上图所示。 我只想从所有 json 响应中添加到 xml 文件中。

【问题讨论】:

标签: php arrays json xml


【解决方案1】:

如果您想将新结果添加到现有 XML 文件中,可以使用类似...

$fileName = "data.xml";
if ( file_exists($fileName))    {
    $xml = simplexml_load_file($fileName);
}
else    {
    $xml= new SimpleXMLElement('<root/>');
}
$array = json_decode ($file, true);
arrayToXml($array, $xml);
$xml->asXML($fileName);

因此,它不是每次都创建一个新的 XML 结构,而是加载任何现有数据(如果有的话),添加新数据,然后将其写回数据文件。

我不确定您所说的“如果可能,只有具有关键结果的数据”是什么意思,如果您可以对此进行扩展,我可能会提供帮助。

更新:

我已经用额外的信息更新了代码,认为这符合您的需求......

function arrayToXml($array, &$xml){
    foreach($array as $key => $value) {
        if(is_array($value)) {
            if(!is_numeric($key)){
                $subnode = $xml->addChild("$key");
                arrayToXml($value, $subnode);
            }else{
                $subnode = $xml->addChild("course");
                arrayToXml($value, $subnode);
            }
        }else {
            $xml->addChild("$key",htmlspecialchars("$value"));
        }
    }
}

if ( file_exists($fileName))    {
    $xml = simplexml_load_file($fileName);
}
else    {
    $xml= new SimpleXMLElement('<results />');
}
$array = json_decode ($file, true);
// Remove _class element
foreach ( $array['results'] as $key=>$result )   {
    unset($array['results'][$key]['_class']);
}
arrayToXml($array['results'], $xml);
$xml->asXML($fileName);

我做的主要事情是将新文档的根元素更改为&lt;results /&gt;,每个项目都添加为“课程”而不是“项目?”,添加新数据时,我从@开始987654326@而不是数据的基础。

我添加了一些代码来从每个元素中删除 _class 项,如果需要,可以将其扩展到其他项 - 如果您想保留此信息,则可以将其删除。

更新

function arrayToXml($array, &$xml){
    foreach($array as $key => $value) {
        if(is_array($value)) {
            if(!is_numeric($key)){
                if ($key == "visible_instructors") {
                    $vi =  $xml->addChild($key);
                    $subnode = $vi->addChild("instructor");
                    arrayToXml($value[0], $subnode);
                }
                else {
                    $subnode = $xml->addChild($key);
                    arrayToXml($value, $subnode);
                }
            }
            else {
                    $subnode = $xml->addChild("course");
                    arrayToXml($value, $subnode);
            }
        }else {
            $xml->addChild("$key",htmlspecialchars("$value"));
        }
    }
}

您的测试在 if(!is_numeric($key)){ 的错误分支中,它使用的是数值,PHP 有时会帮助转换并产生奇怪的结果。此代码检查非数字键是否为visible_instructors 并相应调整内容。

【讨论】:

  • 转换后它们是无用的数据,我感兴趣的是 all child 而不是 8373.........
  • 谢谢它的工作。但它创建了重复的密钥。是否可以在现有树中添加数据。就像我有 所有子数据 现在我希望新 xml 的所有子数据都在现有 树中。
  • 您能否提供几个小的示例 JSON 文件以及它们在最终结果中的外观,这样可以更轻松地按您的意愿制作。
  • 这里是json数据。 drive.google.com/file/d/1NBPHaCCapff7Jmicc_2ZBalPJ0issC9s/… 我想转换为 xml 并从结果数组中获取选定的数据。我计划使用 xmp 进行批量导入,因此数据需要像 Data1 这样的树中的所有迭代数据都应该在
  • drive.google.com/file/d/1ikhfQ5AwW2Iov5-bID_3UNvL0B3PJHM5/… 这是我想要的示例 xml 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
相关资源
最近更新 更多