XML-файлы могут иметь много вложений, что затрудняет их непосредственный перевод в data.frame. Я думаю, что самый простой способ извлечь эти файлы - преобразовать их в нечто более табличное с помощью xslt
.
Использование данных вашего образца
library(xml2)
xml <- read_xml('<GENERIC_ROUGHDRAFT>
<HEADER compName="California" dateCreated="2018-08-07">
<COMP_INFO/>
</HEADER>
<COVERSHEET>
<ESTIMATE_INFO eName="MATTHEW_ANDERSON" iName="Matthew Anderson" priceList="MAY18" laborEff="Restoration/Service/Remodel" claimNumber="01" policyNumber="00000000000" typeOfLoss="Hail" deprNonMat="1" deprOandP="1" deprTaxes="1" onsite="1" recipientsXNAddress="California_BD" carrierId="111111" estimateType="Structural"/>
<ADDRESSES>
<ADDRESS type="Property" street="123 Street Cr" city="Idaho Falls" state="ID" zip="00000" primary="1"/>
<ADDRESS type="Home" street="123 Street Cr" city="City" state="ID" zip="00000"/>
</ADDRESSES>
</COVERSHEET>
</GENERIC_ROUGHDRAFT>')
Мы можем определить xslt для преобразования данных в html-таблицу
xsl <- read_xml('<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/GENERIC_ROUGHDRAFT">
<html>
<table>
<tr>
<td>compName</td><td>dateCreated</td>
<td>iName</td><td>type</td><td>street</td><td>state</td>
</tr>
<xsl:for-each select="//ADDRESS">
<tr>
<td><xsl:value-of select="../../../HEADER/@compName"/></td>
<td><xsl:value-of select="../../../HEADER/@dateCreated"/></td>
<td><xsl:value-of select="../../ESTIMATE_INFO/@iName"/></td>
<td><xsl:value-of select="@type"/></td>
<td><xsl:value-of select="@street"/></td>
<td><xsl:value-of select="@state"/></td>
</tr>
</xsl:for-each>
</table>
</html>
</xsl:template>
</xsl:stylesheet>')
И я сделал ее HTML-таблицей, чтобы использовать rvest::html_table
, чтобы превратить ее в data.frame. Это было бы сделано, как это
library(xslt)
library(rvest)
data <- xml_xslt(xml, xsl) %>% html_table(header = TRUE) %>% .[[1]]
# compName dateCreated iName type street state
# 1 California 2018-08-07 Matthew Anderson Property 123 Street Cr ID
# 2 California 2018-08-07 Matthew Anderson Home 123 Street Cr ID