Как преобразовать несколько вложенных XML-элементов в фрейм данных?

#r #xml #xml2

#r #xml #xml2

Вопрос:

Я пытаюсь преобразовать XML-файл в фрейм данных в r, готовый для вставки в файл CSV. К сожалению, я не могу включить несколько нижних уровней.

Сильно урезанная версия этого файла:

 <Products Count="14790" >
<Product xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <FundCode>MyCompany</FundCode>
    <HospitalCover BasedOnID="">
        <HospitalTier>SilverPlus</HospitalTier>
        <Age Available="true" AvailableTransfer="true" />
        <MedicalServices>
            <MedicalService Title="Item1" Cover="Covered" />
            <MedicalService Title="Item2" Cover="NotCovered" />
        </MedicalServices>
    </HospitalCover>
    </Product>
</Products>
  

Код, который был наиболее успешным для меня, приведен ниже, но я не знаю, как перейти к xml, чтобы получить данные с более низких уровней, в настоящее время он просто группирует данные со следующего более низкого уровня в один столбец.

 xmlfile <- xmlTreeParse("test_import.xml")
topxml <- xmlRoot(xmlfile)
head(topxml)
topxml <- xmlSApply(topxml,
                    function(x) xmlSApply(x, xmlValue))

xml_df <- data.frame(t(topxml),
                     row.names=NULL)
xml_df <- apply(xml_df,2,as.character)

write.csv(xml_df, "test_export.csv")
  

это самое близкое, что у меня есть

Я пробовал xpath, чтобы попытаться вручную сопоставить столбцы с определенными тегами, но я также не нашел никаких элементов

 > a <- read_xml("test_import.xml")
> xml_find_all(a, xpath = "//Product")
{xml_nodeset (0)}
  

То, что я хотел бы иметь, это фрейм данных в соответствии с:

 FundCode   HospitalTier   Age Available  AvailableTransfer   Item1     Item2
MyCompany  SilverPlus     True           True                Covered   NotCovered
  

Комментарии:

1. Вы уверены, что XML допустим?

2. @thelatemail часть «<Products Count=»14790″ >» была в той же строке, что и три тильды, поэтому изначально она не отображалась. Теперь я это исправил

3. Он по-прежнему не проверяется для меня, пока я не добавлю закрывающий </HospitalCover> тег.

4. да, @thelateemail вы были правы, в нем отсутствовал закрывающий тег больницы, который я сейчас исправил, спасибо. Это небольшой пример файла для экономии места, это была моя ошибка, рассматриваемый файл намного больше

5. Какие элементы повторяются? Продукт ? Обычно образцы XML должны содержать достаточно, чтобы знать шаблон. И всегда размещайте корневой тег, поскольку он может содержать важные пространства имен.