我正在从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');
<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;
<root>
<count>8373</count>
<next>...</next>
<previous/>
<results>...</results>
<aggregations>...</aggregations>
</root>
&#13;
简而言之,我希望每个迭代的数据都在一个XML文件中,如果可能的话,只需要包含关键结果的数据及其子项。如上所示。 我只希望从所有json响应中添加到xml文件中。
答案 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)){
并相应地调整内容。