2017-09-02 24 views
0

RのパッケージがXMLからJSONへの変換に適切に機能していないようです。私はRJSONIO、rjson、jsonliteを 'XML'パッケージで試しました。最初にXMLを解析し、XML :: xmlToList()を使用してリストに変換し、それらの3つのパッケージからtoJSON()を使用してJSONに変換しました。XMLをJSONに変換するR

私のXMLファイル:

<?xml version="1.0" encoding="utf-8"?> 
<votes> 
    <row Id="1" PostId="1" VoteTypeId="2" CreationDate="2014-05-13T00:00:00.000" /> 
    <row Id="2" PostId="1" VoteTypeId="2" CreationDate="2014-05-13T00:00:00.000" /> 
    <row Id="3" PostId="3" VoteTypeId="2" CreationDate="2014-05-13T00:00:00.000" /> 
</votes> 

私のソースコード:

library(XML) 
library(RJSONIO) 
library(rjson) 
library(jsonlite) 

xml_parse <- xmlTreeParse("~/Downloads/test.xml", useInternalNodes=TRUE) 
xml_root <- xmlRoot(xml_parse) 
xml_list <- xmlToList(xml_root, simplify = TRUE) 

#jsonlite package 
xml_jsonlite <- jsonlite::toJSON(xml_list) 
write(xml_jsonlite, "test_jsonlite.json") 

#RJSONIO package 
xml_rjsonio <- RJSONIO::toJSON(xml_list) 
write(xml_rjsonio, "test_rjsonio.json") 

#rjson package 
xml_rjson <- RJSONIO::toJSON(xml_list) 
write(xml_rjson, "test_rjson.json") 

RJSONIOから変換JSONファイル:

{ 
"row": { 
    "Id": "98", 
    "PostId": "10", 
    "VoteTypeId": "2", 
    "CreationDate": "2014-05-14T00:00:00.000" 
}, 
"row": { 
    "Id": "99", 
    "PostId": "7", 
    "VoteTypeId": "5", 
    "UserId": "111", 
    "CreationDate": "2014-05-14T00:00:00.000" 
} 
} 

ので、重複するフィールド名を明らかに間違っています。 jsonliteから

変換されたJSONファイル:

{"row":["1","1","2","2014-05-13T00:00:00.000"], 
"row.1":["2","1","2","2014-05-13T00:00:00.000"], 
"row.2":["3","3","2","2014-05-13T00:00:00.000"]} 

代わりに「行」の配列をインクリメントのサブ文書の配列を持つ唯一のフィールド名「行」がなければならないので、奇妙です。それにはフィールド名も含まれていません。

rjsonから変換JSONファイル:

{ 
"row": { 
"Id": "1", 
"PostId": "1", 
"VoteTypeId": "2", 
"CreationDate": "2014-05-13T00:00:00.000" 
}, 
"row": { 
"Id": "2", 
"PostId": "1", 
"VoteTypeId": "2", 
"CreationDate": "2014-05-13T00:00:00.000" 
} 
} 

理想的なJSONファイルのような次のようになります。

ソリューションを探してい
{"votes" : { 
    "row" : [ 
     { 
      "Id" : "1", 
      "PostId" : "1", 
      "VoteTypeId" : "2", 
      "CreationDate" : "2014-05-13T00:00:00.000" 
     }, 
     { 
      "Id" : "2", 
      "PostId" : "1", 
      "VoteTypeId" : "2", 
      "CreationDate" : "2014-05-13T00:00:00.000" 
     } 
     ] 
     } 
} 

。どんな助けもありがとうございます。ので、ここでそれは他の人を助けることができるように掲示部分的な解決策だ、

+0

間違ったJSON文字列とXML変換から出てくるデータを取得するために使用したコードを表示することで、適切に理解できるようになります。 – sconfluentus

答えて

2

xml2jsonliteはあなたが道のほとんどを得るが、あなたも、あなたはRコードはおろか本当にこのためのソリューションをしようとしている知っている私たちを示していない。

library(xml2) 
library(jsonlite) 

read_xml('<?xml version="1.0" encoding="utf-8"?> 
<votes> 
    <row Id="1" PostId="1" VoteTypeId="2" CreationDate="2014-05-13T00:00:00.000" /> 
    <row Id="2" PostId="1" VoteTypeId="2" CreationDate="2014-05-13T00:00:00.000" /> 
    <row Id="3" PostId="3" VoteTypeId="2" CreationDate="2014-05-13T00:00:00.000" /> 
</votes>') -> doc 

x <- xml2::as_list(doc) 

xl <- lapply(x, attributes) 

toJSON(xl, pretty = TRUE, auto_unbox = TRUE) 
## { 
## "row": { 
##  "Id": "1", 
##  "PostId": "1", 
##  "VoteTypeId": "2", 
##  "CreationDate": "2014-05-13T00:00:00.000" 
## }, 
## "row.1": { 
##  "Id": "2", 
##  "PostId": "1", 
##  "VoteTypeId": "2", 
##  "CreationDate": "2014-05-13T00:00:00.000" 
## }, 
## "row.2": { 
##  "Id": "3", 
##  "PostId": "3", 
##  "VoteTypeId": "2", 
##  "CreationDate": "2014-05-13T00:00:00.000" 
## } 
## } 

コメントパー

あなたはしたいどのようなデータが構造化された方法ではありません。つまり、何かが必要な場合は、缶詰のバニラユーティリティを使用することはできません。

xml_find_all(doc, "//votes/row") %>% 
    map_chr(~{ 
    toJSON(as.list(xml_attrs(.x)), auto_unbox = TRUE, pretty = TRUE) 
    }) %>% 
    paste0(collapse=",\n") %>% 
    gsub("[\n]", "\n ", .) %>% 
    sprintf('{ "votes" : {\n row" : [\n %s]\n }\n}', .) %>% 
    cat() 

## { "votes" : { 
## row" : [ 
##  { 
##  "Id": "1", 
##  "PostId": "1", 
##  "VoteTypeId": "2", 
##  "CreationDate": "2014-05-13T00:00:00.000" 
##  }, 
##  { 
##  "Id": "2", 
##  "PostId": "1", 
##  "VoteTypeId": "2", 
##  "CreationDate": "2014-05-13T00:00:00.000" 
##  }, 
##  { 
##  "Id": "3", 
##  "PostId": "3", 
##  "VoteTypeId": "2", 
##  "CreationDate": "2014-05-13T00:00:00.000" 
##  }] 
## } 
## } 
+0

@hrbrmstrという回答に感謝します。私はすでに私の投稿で言ったように私はすでにjsonliteを試して、あなたがここで見ることができるように出力が本当に理想的ではない、理想的な出力は複数の "行"の代わりにサブドキュメントの配列を含む1つのフィールド名 "行"単一の文書。 –

関連する問題