Разбор XML продолжает давать набор узлов 0

Это мой первый вопрос о стеке, поэтому, если я сделал что-то не так, сообщите мне.

Я пытаюсь проанализировать данные с помощью пакета xml2 и, возможно, пакета pandas. Ниже вы можете найти анонимный снимок данных.

<?xml version="1.0" encoding="utf-8"?>
<a xmlns:xsd="http://www.y.org/y1/y2" xmlns:xsi="http://www.y.org/y1/y3" xmlns="http://x.nl/">
  <b1>1</b1>
  <b2>2019-07-01T10:01:35.312+02:00</b2>
  <b3>xxx</b3>
  <b4>xxx</b4>
  <b5>
    <c>
      <d1>
      </d1>
      <d2>xxxx</d2>
      <d3>
        <e1>
        </e1>
        <e2>
          <ID>1</ID>
          <f2>XXXXXXXXXXX</f2>
          <event>
            <eventType>start</eventType>
            <eventValue>true</eventValue>
            <timestamp>2019-10-07T13:45:00.00+02.00</timestamp>
          </event>
          <event>
            <eventType>next</eventType>
            <eventValue>itm1</eventValue>
            <timestamp>2019-10-07T13:46:00.00+02.00</timestamp>
          </event>
          <event>
            <eventType>next</eventType>
            <eventValue>itm2</eventValue>
            <timestamp>2019-10-07T13:47:00.00+02.00</timestamp>
          </event>
          <event>
            <eventType>next</eventType>
            <eventValue>itm3</eventValue>
            <timestamp>2019-10-07T13:48:00.00+02.00</timestamp>
          </event>
          

Я хочу создать что-то вроде таблицы ниже.

+-----------+------------+------------------------------+
| EventType | EventValue |          timestamp           |
+-----------+------------+------------------------------+
| start     | true       | 2019-10-07T13:45:00.00+02.00 |
| next      | itm1       | 2019-10-07T13:46:00.00+02.00 |
| next      | itm2       | 2019-10-07T13:47:00.00+02.00 |
| next      | itm3       | 2019-10-07T13:48:00.00+02.00 |
+-----------+------------+------------------------------+

Я попробовал функцию xml_find_all, чтобы найти все события, но всегда получаю {xml_nodeset (0))}.

x <- xml_find_all(data, "//event", xml_ns(data))

Может ли кто-нибудь отправить меня в правильном направлении и, возможно, дать мне подсказку для создания фрейма данных, как указано выше? Было бы потрясающе


person Wessel van Bakel    schedule 07.10.2020    source источник


Ответы (1)


Этот файл XML содержит несколько пространств имен:

> xml_ns(data)
d1  <-> http://x.nl/
xsd <-> http://www.y.org/y1/y2
xsi <-> http://www.y.org/y1/y3

Чтобы прочитать узлы из него, есть 2 способа. Самый простой способ — удалить все пространства имен:

xml_ns_strip(data)
events <- xml_find_all(data, "//event")
df_event <- 
  data.frame(
    EventType = events %>% xml_find_first("./eventType") %>% xml_text(),
    EventValue = events %>% xml_find_first("./eventValue") %>% xml_text(),
    timestamp = events %>% xml_find_first("./timestamp") %>% xml_text()
  )

Или вы можете добавить префикс к вашему XPath, чтобы получить узлы:

events <- xml_find_all(data, "//d1:event")  # d1 is the default namespace
df_event <- 
  data.frame(
    EventType = events %>% xml_find_first("./d1:eventType") %>% xml_text(),
    EventValue = events %>% xml_find_first("./d1:eventValue") %>% xml_text(),
    timestamp = events %>% xml_find_first("./d1:timestamp") %>% xml_text()
  )

Выход:

> df_event
  EventType EventValue                    timestamp
1     start       true 2019-10-07T13:45:00.00+02.00
2      next       itm1 2019-10-07T13:46:00.00+02.00
3      next       itm2 2019-10-07T13:47:00.00+02.00
4      next       itm3 2019-10-07T13:48:00.00+02.00
person xwhitelight    schedule 08.10.2020