Фильтр xpath - как фильтровать последнюю запись узла - PullRequest
0 голосов
/ 23 января 2020

У меня проблема с фильтрацией xpath на указанном узле, чтобы иметь только самую последнюю запись. В примере xml существует правило, что самая первая запись на каждом узле является самой последней информацией. Я хотел бы отфильтровать все записи, которые не имеют отношения (отличается от первой записи).

Второе правило заключается в том, что я не хочу использовать условия даты для фильтрации всех записей job_information после самой первой.

Обычно я использую тестер xpath с выражением, например: / queryCompoundEmployeeResponse / CompoundEmployee [(person / занятости_информации / job_information [1])], который дает мне только первую запись информации о работе, но здесь не работает. Можете ли вы показать мне, что с ним не так?

Можете ли вы мне помочь?

xml вход с 3 записями job_information

<queryCompoundEmployeeResponse>
  <CompoundEmployee>
    <id>11111</id>
    <person>
      <employment_information>
        <job_information>
          <end_date>9999-12-31</end_date>
          <start_date>2017-05-17</start_date>
        </job_information>
        <job_information>
          <end_date>2018-12-31</end_date>
          <start_date>2017-05-17</start_date>
        </job_information>
        <job_information>
          <end_date>2016-12-31</end_date>
          <start_date>2013-05-17</start_date>
        </job_information>
      </employment_information>
    </person>
  </CompoundEmployee>
</queryCompoundEmployeeResponse>

xml выходной сигнал, который я хотел бы получить

<queryCompoundEmployeeResponse>
  <CompoundEmployee>
    <id>11111</id>
    <person>
      <employment_information>
        <job_information>
          <end_date>9999-12-31</end_date>
          <start_date>2017-05-17</start_date>
        </job_information>
      </employment_information>
    </person>
  </CompoundEmployee>
</queryCompoundEmployeeResponse>

1 Ответ

0 голосов
/ 23 января 2020

Предполагая, что у вас всегда одна и та же XML структура, вы можете попробовать:

data=xmlParse("C:/Users/.../pathtoyourxmlfile.xml")
a=xpathSApply(data,"count(//job_information[1]/ancestor::*)+6")
b=xpathSApply(data,"count(//job_information)-1")*4+(a-1)

old=read_lines("C:/Users/.../pathtoyourxmlfile.xml")
new = old[-(a:b)]

writeLines(new,con = "new.xml")

Вывод (новый. xml):

<queryCompoundEmployeeResponse>
  <CompoundEmployee>
    <id>11111</id>
    <person>
      <employment_information>
        <job_information>
          <end_date>9999-12-31</end_date>
          <start_date>2017-05-17</start_date>
        </job_information>
      </employment_information>
    </person>
  </CompoundEmployee>
</queryCompoundEmployeeResponse>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...