Сложный синтаксический анализ XML в R - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь проанализировать вложенный 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>

Я пытаюсь извлечь информацию, такую ​​как iName и прайс-лист.

Для моего конечного продукта я надеялся получить фрейм данных, в котором информация выглядит как одна строка, включающая только следующее:

compName  |  dataCreated  | iName  |  Type  | Street|  | State

Не так много документации о том, как извлечь с несколькимиданные внутри одного сегмента.

Есть предложения?

1 Ответ

0 голосов
/ 24 августа 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...