分析を行うために、R と XML パッケージを使用して XML をデータフレームにインポートしたいと考えています。XML ファイルの例:
<watchers shop_name="TEST" created_at="September 14, 2012 05:44">
<watcher channel="Site Name">
<code>123456</code>
<search_key>TestKey</search_key>
<date>September 14, 2012 04:15</date>
<result>Found</result>
<link>http://www.test.com/fakeurl</link>
<price>100.0</price>
<shipping>0.0</shipping>
<origposition>0</origposition>
<name>Name Test</name>
<results>
<result position="1">
<c_name>CTest1</c_name>
<c_price>599.49</c_price>
<c_shipping>0.0</c_shipping>
<c_total_price>599.49</c_total_price>
<c_rating>8.3</c_rating>
<c_delivery/>
</result><result position="2">
<c_name>CTest2</c_name>
<c_price>654.0</c_price>
<c_shipping>0.0</c_shipping>
<c_total_price>654.0</c_total_price>
<c_rating>9.8</c_rating>
<c_delivery/>
</result>
<result position="3">
<c_name>CTest3</c_name>
<c_price>654.0</c_price>
<c_shipping>0.0</c_shipping>
<c_total_price>654.0</c_total_price>
<c_rating>8.8</c_rating>
<c_delivery/>
</result>
</results>
</watcher>
</watchers>
次のフィールドを含むデータフレームの行が必要です。
shop_name created_at code search_key date result
link price shipping origposition name
position c_name c_price c_shipping c_total_price
c_rating c_delivery
これは、子ノードも考慮する必要があることを意味し、この例では 3 行のデータフレームになります (結果が 3 つの位置を示しているため)。フィールド
shop_name created_at code search_key
date result link price shipping
origposition name
これらの各行で同じです。
XML ファイルを調べることはできますが、必要なフィールドを含むデータフレームを取得できません。データフレームをデータフレームに変換すると、次のフィールドが取得されます。
"code" "search_key" "date" "result"
"link" "price" "shipping" "origposition"
"name" "results"
ここでフィールド
shop_name created_at
最初に欠落しており、「結果」は列「結果」の下の文字列にまとめられます。
必要なデータフレームを取得できるはずですが、これを正確に行う方法がわかりません。
アップデート
@MvG が提供するソリューションは、上記のテスト XML ファイルで見事に機能します。ただし、「結果」列の値が「見つかりません」になる場合もあります。この値を持つエントリは、特定のフィールド (常に同じフィールド) を見逃すため、ソリューションの実行時に「引数の列数が一致しません」というエラーが発生します。これらのエントリをデータフレームにも配置し、存在しないフィールドを空のままにしたいと思います。このシナリオを組み込む方法がわかりません。
test.xml
<watchers shop_name="TEST" created_at="September 14, 2012 05:44">
<watcher channel="Site Name">
<code>123456</code>
<search_key>TestKey</search_key>
<date>September 14, 2012 04:15</date>
<result>Found</result>
<link>http://www.test.com/fakeurl</link>
<price>100.0</price>
<shipping>0.0</shipping>
<origposition>0</origposition>
<name>Name Test</name>
<results>
<result position="1">
<c_name>CTest1</c_name>
<c_price>599.49</c_price>
<c_shipping>0.0</c_shipping>
<c_total_price>599.49</c_total_price>
<c_rating>8.3</c_rating>
<c_delivery/>
</result><result position="2">
<c_name>CTest2</c_name>
<c_price>654.0</c_price>
<c_shipping>0.0</c_shipping>
<c_total_price>654.0</c_total_price>
<c_rating>9.8</c_rating>
<c_delivery/>
</result>
<result position="3">
<c_name>CTest3</c_name>
<c_price>654.0</c_price>
<c_shipping>0.0</c_shipping>
<c_total_price>654.0</c_total_price>
<c_rating>8.8</c_rating>
<c_delivery/>
</result>
</results>
</watcher>
<watcher channel="Shopping">
<code>12804</code>
<search_key></search_key>
<date></date>
<result>Not found</result>
<link>https://www.test.com/testing1323p</link>
<price>0.0</price>
<shipping>0.0</shipping>
<origposition>0</origposition>
<name>MOOVM6002020</name>
<results>
</results>
</watcher>
</watchers>