结合来自JSON转换的多个XML

时间:2018-02-22 07:39:59

标签: php arrays json xml

我正在从JSON中的API收集数据并将其转换为XML。现在所有数据都无法立即收集,因此我只能在一次运行中获得100个项目,并将每个JSON响应转换为XML并为每个项目创建单独的文件。 我使用变量$ i来增加Page for JSON并使用它来为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');

&#13;
&#13;
<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>
&#13;
&#13;
&#13;

&#13;
&#13;
<root>
<count>8373</count>
<next>...</next>
<previous/>
<results>...</results>
<aggregations>...</aggregations>
</root>
&#13;
&#13;
&#13;

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

1 个答案:

答案 0 :(得分:0)

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

的方式完成
library(ggplot2)
library(dplyr)
library(shiny)

set.seed(1)
name <- c("a", "b", "c")
v1 <- sample(1:100, 3)
v2 <- sample(1:100, 3)

df <- data_frame(name, v1, v2) 


ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectizeInput("select", "select column:", choices = colnames(df), selected = "v1")
    ),
    mainPanel(
      plotOutput("plot")
    )
  )
)

server <- function(input, output){

  data <- reactive({

    df %>% 
      select(name, y = input$select)

  })

  output$plot <- renderPlot({
    ggplot(data())+
      geom_col(aes(x = name, y = y))+
      geom_hline(yintercept = mean(data()$y, na.rm = TRUE), color = "red", size = 1)

  })

}

shinyApp(ui = ui, server = server)

因此,不是每次都创建一个新的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);

我做的主要事情是将新文档的根元素更改为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); ,每个项目都添加为“课程”而不是“项目?”,并且在添加新数据时,我开始在<results />而不是数据的基础。

我添加了一些代码来从每个元素中删除$array['results']项,如果需要,可以将其扩展为其他项目,或者如果要保留此信息,则将其删除。

<强>更新

_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")); } } } 的错误分支中,它正在处理数值,PHP有时会有效地转换并生成奇怪的结果。此代码检查非数字键是否为if(!is_numeric($key)){并相应地调整内容。