2017-11-12 22 views
2

こんにちは、私はRとXMLファイルが初めてです。ネストされたXMLからRへのデータフレームへ

私はデータフレームの中に、このXML SOAPレスポンスを取得しようとしている:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <PrepareDataByClientResponse xmlns="urn:HM-schema"> 
     <PrepareDataByClientResult> 
     <READOUT> 
      <SerialNumber>1728527</SerialNumber> 
      <Date>1510505992000</Date> 
      <Type>1</Type> 
      <Value>78.2</Value> 
      <Status>OK</Status> 
     </READOUT> 
     <READOUT> 
      <SerialNumber>1728527</SerialNumber> 
      <Date>1510509592000</Date> 
      <Type>1</Type> 
      <Value>76.87</Value> 
      <Status>OK</Status> 
     </READOUT> 
     <READOUT> 
      <SerialNumber>1728527</SerialNumber> 
      <Date>1510513192000</Date> 
      <Type>1</Type> 
      <Value>75.61</Value> 
      <Status>OK</Status> 
     </READOUT> 
     <READOUT> 
      <SerialNumber>e2ddeed13b4cc4d132f8c6a67d67eed3</SerialNumber> 
      <Date>4531528776000</Date> 
      <Type>3</Type> 
      <Value>230.68</Value> 
      <Status>OK</Status> 
     </READOUT> 
     </PrepareDataByClientResult> 
     </PrepareDataByClientResponse> 
     </soap:Body> 
    </soap:Envelope> 

私のようないくつかのオプション試してみました:

SOでの大規模な研究や他のGoogle検索後
xmlout <- do.call(rbind, xpathApply(xmldoc,'//soap:Envelope/soap:Body/PrepareDataByClientResponse', xmlToDataFrame)) 
xmlout <- as.data.frame(t(xpathSApply(xmldoc,"//readout",function(x) xmlSApply(x,xmlValue)))) 
xmlout <- as.data.frame(t(xmlSApply(xmldoc["/PrepareDataByClientResponse/PrepareDataByClientResult/READOUT"],xmlAttrs)),stringsAsFactors=FALSE) 
xmlout <- ldply(xmlToList(xmldoc), data.frame) 

を、私は所望の結果を得ることができなかった。私が得ることができるのは、1つの行と、それぞれ異なる列のすべての観測値を持つデータフレームです。

私のような読み出しのテーブル取得しようとしている:

SerialNumber Date   Type Value Status 
1 1728527   1510505992000 1  78.2  OK 
2 1728527   1510509592000 1  76.87 OK 
3 1728527   1510513192000 1  75.61 OK 

が動作するように、テーブルのこの種を取得する方法はありますか?

ありがとうございます。

答えて

2

<PrepareDataByClientResponse>タグにデフォルトの名前空間(つまり、接頭辞がコロンで区切られていないxmlns)があるため、すべての子がこのデフォルトの名前空間に従います。

<READOUT>タグを解析するには、getNodeSet()コールで使用するプレフィックスを宣言することを検討してください。以下はnmです。あなたが持っているように、このようなコールは、その後、データフレームに簡単に比較的平坦なXMLを移行することができ便利なメソッドxmlToDataFrame内で使用することができます。

library(XML) 

doc <- xmlParse('/path/to/SOAP/Response.xml') 

df <- xmlToDataFrame(doc, nodes=getNodeSet(doc, "//nm:READOUT", 
              namespaces=c(nm="urn:HM-schema"))) 

df 
#      SerialNumber   Date Type Value Status 
# 1       1728527 1510505992000 1 78.2  OK 
# 2       1728527 1510509592000 1 76.87  OK 
# 3       1728527 1510513192000 1 75.61  OK 
# 4 e2ddeed13b4cc4d132f8c6a67d67eed3 4531528776000 3 230.68  OK 
+0

素晴らしい、それは魔法のように仕事をしました。説明は私のような初心者にとっても非常に便利でした。ありがとうございました! –

+0

@JavierNevado - 聞いて喜んで喜んで助けてください。ハッピーコーディング! – Parfait

関連する問題