Преобразование XML в CSV с R, когда некоторые узлы отсутствуют - PullRequest
0 голосов
/ 03 ноября 2018

Я использую пакет xml2 для преобразования файла XML в CSV. XML, с которым я имею дело, имеет следующую структуру - обратите внимание, что <businessAddress> появляется только в двух из <business> узлов.

<businesses>
    <business>
       <businessName>...</businessName>
       <businessAddress>...</businessAddress>
       <businessPostcode>...</businessPostcode>
    </business>
    <business>
       <businessName>...</businessName>
       <businessAddress>...</businessAddress>
       <businessPostcode>...</businessPostcode>
     </business>
    <business>
       <businessName>...</businessName>
       <businessPostcode>...</businessPostcode>
    </business>
</businesses>

Мой R выглядит так:

data <- read_xml("/path/to/the/xml")

businessName_nodes <- xml_find_all(data, "//businessName")
businessName <- xml_text(businessName_nodes)

businessAddress_nodes <- xml_find_all(data, "//businessAddress")
businessAddress <- xml_text(businessAddress_nodes)

businessPostcode_nodes <- xml_find_all(data, "//businessPostcode")
businessPostcode <- xml_text(businessPostcode_nodes)

framedData = data.frame(
  businessName, 
  businessAddress, 
  businessPostcode,
  stringsAsFactors = FALSE) 

write.csv(framedData, file = csvName) 

Это дает мне ошибку Error in data.frame... arguments imply differing number of rows, потому что не каждый <business> содержит <businessAddress>.

Мой вопрос заключается в том, как решить эту проблему, чтобы я мог получить кадр, в котором, когда отсутствует <businessAddress>, создается нулевое значение

"", "businessName", "businessAddress", "businessPostcode"
9123, "Bob Smith", NA, "‎M1R 0E9" 

Или если нет, то строка в кадре данных вообще не создается.

Новичок в R, так что оцените помощь

1 Ответ

0 голосов
/ 03 ноября 2018

Вы можете использовать xml_find_first из пакета xml2 ... Цикл по бизнес-узлам, и если xpath-совпадение не найдено, результат будет NA.

образец данных

xmlText <- "<businesses>
  <business>
  <businessName>...</businessName>
  <businessAddress>...</businessAddress>
  <businessPostcode>...</businessPostcode>
  </business>
  <business>
  <businessName>...</businessName>
  <businessAddress>...</businessAddress>
  <businessPostcode>...</businessPostcode>
  </business>
  <business>
  <businessName>...</businessName>
  <businessPostcode>...</businessPostcode>
  </business>
  </businesses>"

код

library( xml2 )
library( magrittr ) #for the pipe symbol

doc <- read_xml( xmlText )

business_nodes <- xml_find_all( doc, ".//business" )

data.frame( 
  businessName = xml_find_first( business_nodes, ".//businessName" ) %>% xml_text(),
  businessAddress = xml_find_first( business_nodes, ".//businessAddress" ) %>% xml_text(),
  businessPostcode = xml_find_first( business_nodes, ".//businessPostcode" ) %>% xml_text(),
  stringsAsFactors = FALSE )

#   businessName businessAddress businessPostcode
# 1          ...             ...              ...
# 2          ...             ...              ...
# 3          ...            <NA>              ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...