2016-11-22 6 views
0

У меня есть куча транскриптов чата в формате XML. Я включил образец записи ниже. Мне не нужна вся запись, всего 3 вещи. Первый атрибут @realTimeID. Второй/третий элемент - это значения из varValue, когда источник == «PostChat». Это будет содержать числовое значение от 1 до 10. Может быть второе значение, которое включает текстовую запись. Только небольшое количество записей будет содержать эти значения «PostChat».R XML для подмножества DataFrame

Что я хочу - это кадр данных с столбцом для realTimeID, а затем 2 столбца для числового и возможного текстового значения. Если бы я мог получить dataframe со столбцом для realTimeID и вторым столбцом для значения, я мог бы работать с данными оттуда просто отлично.

Вот некоторые примерные данные:

<Report account="12345" end_time="2016-07-01T00:00:59+00:00" limit="10000" more_sessions="true" start_time="2016-06-11T00:00:00+00:00" user="smith"> 
    <Session id="ID1536678170" realTimeID="4768543970"> 
     <Visitor id="1131902386012684"> 
     <ip>123.456.789</ip> 
     <agent>Chrome 51.0.2704.63</agent> 
     <host/> 
     <chatReferer> foo </chatReferer> 
     <GeoInfo> 
      <geoCity/> 
      <geoConType/> 
      <geoCountry>USA</geoCountry> 
      <geoIP>123.456.789</geoIP> 
      <geoISP>USA ISP</geoISP> 
      <geoOrg>NA</geoOrg> 
      <geoPost/> 
      <geoReg/> 
     </GeoInfo> 
     </Visitor> 
     <Chat end_time="2016-06-11T21:46:14+00:00" start_time="2016-06-11T21:25:59+00:00"> 
     <line by="info" time="2016-06-11T21:25:59+00:00"> 
      <Text>Please do not post credit card or other sensitive data in this window. </Text> 
     </line> 
     <line by="info" time="2016-06-11T21:26:03+00:00"> 
      <Text>You are now chatting with John.</Text> 
     </line> 
     <line by="John" repId="ID2447" time="2016-06-11T21:28:04+00:00"> 
      <HTML>&lt;span dir="ltr"&gt;Hi sir&lt;/span&gt;</HTML> 
     </line> 
     <line by="John" repId="ID2447" time="2016-06-11T21:28:15+00:00"> 
      <HTML>&lt;span dir="ltr"&gt;How may i help you ?&lt;/span&gt;</HTML> 
     </line> 
     <line by="you" time="2016-06-11T21:28:16+00:00"> 
      <Text>Hi John. Im Bob. I have a technical question.</Text>  
     </line> 
     </Chat> 
     <VarValues> 
     <varValue id="ID917165" name="DisconnectedBy" source="Internal" sourceName="null" time="2016-06-11T21:46:14+00:00">RepStoppedChat</varValue> 
     <varValue id="ID922205" name="language" source="MonitorTag" sourceName="null" time="2016-06-11T21:23:46+00:00">English</varValue> 
     <varValue id="ID1317606" name="pageLoadTime" source="MonitorTag" sourceName="null" time="2016-06-11T21:23:46+00:00">88 sec</varValue> 
     <varValue id="ID1323660" name="survey90990357" source="Operator" sourceName="null" time="2016-06-11T21:32:38+00:00">Incomplete (INC) - customer abandons</varValue> 
     <varValue id="ID1372749" name="LP_Visitor_Category" source="Internal" sourceName="null" time="2016-06-11T21:23:43+00:00">0</varValue> 
     <varValue id="ID1617100" name="live_engage_control_group" source="Internal" sourceName="null" time="2016-06-11T21:23:43+00:00">false</varValue> 
     <varValue id="ID3647561" name="rerouteFlag" source="Rule Engine" sourceName="null" time="2016-06-11T21:23:46+00:00">true</varValue> 
     <varValue id="ID3665417" name="operatorName" source="Rule Engine" sourceName="null" time="2016-06-11T21:26:03+00:00">John Doe</varValue> 
     <varValue id="ID3730453" name="RenameFlag" source="Rule Engine" sourceName="null" time="2016-06-11T21:23:46+00:00">true</varValue> 
     <varValue id="ID3742796" name="PT-EligibleInSession" source="Rule Engine" sourceName="null" time="2016-06-11T21:24:43+00:00">Yes</varValue> 
     <varValue id="ID3834774" name="survey88140234" source="PostChat" sourceName="null" time="2016-06-13T04:44:54+00:00">10</varValue> 
     <varValue id="ID3834774" name="survey88140234" source="PostChat" sourceName="null" time="2016-06-13T04:44:54+00:00">Great Experience. Thanks for the help!</varValue> 
     </VarValues> 
     <Reps> 
     <Rep endTime="2016-06-11T21:46:14+00:00" id="ID2447" order="1" repName="John Doe" startTime="2016-06-11T21:26:03+00:00">John</Rep> 
     </Reps> 
    </Session> 
     <Session id="ID1536678170" realTimeID="123456789"> 
     <Visitor id="1131902386012684"> 
     <ip>123.456.789</ip> 
     <agent>Chrome 51.0.2704.63</agent> 
     <host/> 
     <chatReferer> foo </chatReferer> 
     <GeoInfo> 
      <geoCity/> 
      <geoConType/> 
      <geoCountry>USA</geoCountry> 
      <geoIP>123.456.789</geoIP> 
      <geoISP>USA ISP</geoISP> 
      <geoOrg>NA</geoOrg> 
      <geoPost/> 
      <geoReg/> 
     </GeoInfo> 
     </Visitor> 
     <Chat end_time="2016-06-11T21:46:14+00:00" start_time="2016-06-11T21:25:59+00:00"> 
     <line by="info" time="2016-06-11T21:25:59+00:00"> 
      <Text>Please do not post credit card or other sensitive data in this window. </Text> 
     </line> 
     <line by="info" time="2016-06-11T21:26:03+00:00"> 
      <Text>You are now chatting with John.</Text> 
     </line> 
     <line by="John" repId="ID2447" time="2016-06-11T21:28:04+00:00"> 
      <HTML>&lt;span dir="ltr"&gt;Hi sir&lt;/span&gt;</HTML> 
     </line> 
     <line by="John" repId="ID2447" time="2016-06-11T21:28:15+00:00"> 
      <HTML>&lt;span dir="ltr"&gt;How may i help you ?&lt;/span&gt;</HTML> 
     </line> 
     <line by="you" time="2016-06-11T21:28:16+00:00"> 
      <Text>Hi John. Im Bob. I have a technical question.</Text>  
     </line> 
     </Chat> 
     <VarValues> 
     <varValue id="ID917165" name="DisconnectedBy" source="Internal" sourceName="null" time="2016-06-11T21:46:14+00:00">RepStoppedChat</varValue> 
     <varValue id="ID922205" name="language" source="MonitorTag" sourceName="null" time="2016-06-11T21:23:46+00:00">English</varValue> 
     <varValue id="ID1317606" name="pageLoadTime" source="MonitorTag" sourceName="null" time="2016-06-11T21:23:46+00:00">88 sec</varValue> 
     <varValue id="ID1323660" name="survey90990357" source="Operator" sourceName="null" time="2016-06-11T21:32:38+00:00">Incomplete (INC) - customer abandons</varValue> 
     <varValue id="ID1372749" name="LP_Visitor_Category" source="Internal" sourceName="null" time="2016-06-11T21:23:43+00:00">0</varValue> 
     <varValue id="ID1617100" name="live_engage_control_group" source="Internal" sourceName="null" time="2016-06-11T21:23:43+00:00">false</varValue> 
     <varValue id="ID3647561" name="rerouteFlag" source="Rule Engine" sourceName="null" time="2016-06-11T21:23:46+00:00">true</varValue> 
     <varValue id="ID3665417" name="operatorName" source="Rule Engine" sourceName="null" time="2016-06-11T21:26:03+00:00">John Doe</varValue> 
     <varValue id="ID3730453" name="RenameFlag" source="Rule Engine" sourceName="null" time="2016-06-11T21:23:46+00:00">true</varValue> 
     <varValue id="ID3742796" name="PT-EligibleInSession" source="Rule Engine" sourceName="null" time="2016-06-11T21:24:43+00:00">Yes</varValue> 
     </VarValues> 
     <Reps> 
     <Rep endTime="2016-06-11T21:46:14+00:00" id="ID2447" order="1" repName="John Doe" startTime="2016-06-11T21:26:03+00:00">John</Rep> 
     </Reps> 
    </Session> 
</Report> 

Я могу читать данные:

library(XML) 

dat <- xmlInternalTreeParse("data/sessions6.xml", useInternalNodes = T) 

я могу извлечь значение realTimeID с помощью:

foo <- xpathApply(datRoot, "//Session", xmlGetAttr, "realTimeID") 

и varValues ​​мне нужно используя:

tmp <- xpathApply(datRoot, "//varValue[@source='PostChat']", xmlValue) 

Но я не знаю, как соединить эти два и получить значения realTimeID, связанные с параметрами PostChat varValues. В качестве альтернативы, я думал о создании фреймворка данных с realTimeID и всеми VarValues. Я, очевидно, имею список всех ID, но не был уверен, как я могу просто извлечь DataFrame VarValues. Любая помощь будет оценена по достоинству.

EDIT: Я обновил свой образец кода XML, чтобы сделать его более полным и включить один сеанс с значениями PostChat и без него. Благодаря!

+0

Будет ли каждый XML нести только один или два 'varValues' с' @ postChat'? Для однорядного df 3 варов? – Parfait

+0

Каждая «запись» должна иметь не более 2 «PostChat» varValues. Однако в большинстве записей не будет никаких переменных PostChat varValues. Я разместил XML для одной записи. Каждый из моих xml-файлов фактически имеет списки 10k . –

ответ

2

Для обновленного XML-файла, вы можете это:

require(xml2) 
require(tidyverse) 
doc <- read_xml(path_to_file) 
sessions <- doc %>% xml_find_all("Session") 
realTimeID <- sessions %>% map(xml_attr, "realTimeID") 
varValue <- sessions %>% 
    map(xml_find_all, ".//varValue[@source='PostChat']") %>% 
    map(xml_text) 
map2_df(realTimeID, varValue, ~tibble(realTimeID = .x, value = .y[1], text = .y[2])) 

Который дает вам:

# A tibble: 2 × 3 
    realTimeID value         text 
     <chr> <chr>         <chr> 
1 4768543970 10 Great Experience. Thanks for the help! 
2 123456789 <NA>         <NA> 

Вы можете использовать type_convert, чтобы изменить столбец набранный

+0

Спасибо за ввод. Я думаю, что этот подход не работает, когда некоторые значения realTimeID не имеют PostChat varValue. Я обновил свой пример XML, чтобы сделать его более полным и включить вторую запись сеанса, которая не имеет значений PostChat. –

+0

Aweseme! Спасибо. Это сработало отлично. –

Смежные вопросы