简体   繁体   中英

Multiple XML attributes to data.frame in R

I am trying to learn R's XML package. I am trying to create a data.frame with only certain attributes (calendar-startdate, starttime, title) from the below XML file:

    <?xml version="1.0" encoding="UTF-8"?>
<TRANSMISSIONS xsi:noNamespaceSchemaLocation="C:/WhatsOn/EP22D5~1.XSD" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Transmission>
<Transmission_details tx-id="49498536812" channel="PRIME Star" calendar-startdate="2015-03-01" broadcast-startdate="2015-03-01" starttime="08:00" endtime="09:20" rerun="true" live="false" runnumber="28" />
<Program>
<Program_Details content-id="TN00030640/00/0000" version="DVNL" title="Super Buddies" productionyear="2013" productioncountry="UNITED STATES" category="Familiefilm" synopsis1="(Nederlands gesproken) Humor, actie en geweldige nieuwe personages in een nieuw Disney-avontuur waarin een nieuw ras superhelden wordt geboren. Van de makers van 'Air Buddies', 'Snow Buddies', 'Santa Buddies' en 'Spooky Buddies'.&#xA;&#xA;&#xA;Een gewone dag op de Fernfield boerderij wordt bijzonder wanneer Budderball, Mudbud, B-Dawg, Buddha en Rosebud mysterieuze ringen ontdekken die hun elk een unieke superkracht geven. Nog voor je kunt zeggen 'Buddies, verzamelen', gebruiken de puppies hun geweldige gaven en komen in actie wanneer een gedaanteverwisselende pestkop uit de ruimte de aarde bedreigt. Maar zal het ze lukken om de boel te redden zonder hun nieuwe identiteiten te onthullen?" synopsis3="(Nederlands gesproken) Humor, actie en geweldige nieuwe personages in een nieuw Disney-avontuur waarin een nieuw ras superhelden wordt geboren. Van de makers van 'Air Buddies', 'Snow Buddies', 'Santa Buddies' en 'Spooky Buddies'.&#xA;&#xA;&#xA;Een gewone dag op de Fernfield boerderij wordt bijzonder wanneer Budderball, Mudbud, B-Dawg, Buddha en Rosebud mysterieuze ringen ontdekken die hun elk een unieke superkracht geven. Nog voor je kunt zeggen 'Buddies, verzamelen', gebruiken de puppies hun geweldige gaven en komen in actie wanneer een gedaanteverwisselende pestkop uit de ruimte de aarde bedreigt. Maar zal het ze lukken om de boel te redden zonder hun nieuwe identiteiten te onthullen?" vodcrid="crid://telenet.be/AA/TN00030640_00_0000-DVNL-HD">
</Program_Details>
<Viewing_Info kw_violence="false" kw_drugs="false" kw_language="false" kw_sex="false" kw_fear="false" kw_discrimination="false">
</Viewing_Info>
<Crew>
<Crewmember Fullname="Robert Vince" Function="Director" />
</Crew>
</Program>
</Transmission>
<Transmission>
<Transmission_details tx-id="45574036812" channel="PRIME Star" calendar-startdate="2015-03-01" broadcast-startdate="2015-03-01" starttime="09:20" endtime="11:00" rerun="true" live="false" runnumber="11" />
<Program>
<Program_Details content-id="TN00030706/00/0000" version="OSNL" title="Until She Came Along" productionyear="2013" productioncountry="UNITED STATES" category="Romantische film " synopsis1="Romantische komedie van de regisseur van 'The Castle' en 'The Dish', met Josh Lawson ('Freeloaders', tv-serie 'House of Lies') en Rachael Taylor ('The Darkest Hour', 'Transformers').&#xA;&#xA;&#xA;Twintiger Ben heeft het helemaal voor elkaar: een geslaagde carrière, vrienden, feesten, mooie vrouwen, en geen verplichtingen. Maar hoewel zijn mannelijke vrienden bijna allemaal jaloers op hem zijn, voelt zijn leven niet compleet. Als hij op een dag een lezing moet houden op zijn oude school, loopt hij zijn vroegere klasgenote Alex tegen het lijf. Vanaf dat moment begint Ben vraagtekens te plaatsen bij zijn bestaan. Een jaar lang gaat hij op zoek naar zichzelf en wat hij nu eigenlijk wil. En dan pas wordt hij zich bewust van de mogelijkheid dat de zin van het leven schuilt in de dingen die hij altijd al doet en dat het enige ontbrekende stukje van de puzzel misschien wel dat meisje uit zijn jeugd is." synopsis3="Romantische komedie van de regisseur van 'The Castle' en 'The Dish', met Josh Lawson ('Freeloaders', tv-serie 'House of Lies') en Rachael Taylor ('The Darkest Hour', 'Transformers').&#xA;&#xA;&#xA;Twintiger Ben heeft het helemaal voor elkaar: een geslaagde carrière, vrienden, feesten, mooie vrouwen, en geen verplichtingen. Maar hoewel zijn mannelijke vrienden bijna allemaal jaloers op hem zijn, voelt zijn leven niet compleet. Als hij op een dag een lezing moet houden op zijn oude school, loopt hij zijn vroegere klasgenote Alex tegen het lijf. Vanaf dat moment begint Ben vraagtekens te plaatsen bij zijn bestaan. Een jaar lang gaat hij op zoek naar zichzelf en wat hij nu eigenlijk wil. En dan pas wordt hij zich bewust van de mogelijkheid dat de zin van het leven schuilt in de dingen die hij altijd al doet en dat het enige ontbrekende stukje van de puzzel misschien wel dat meisje uit zijn jeugd is." vodcrid="crid://telenet.be/AA/TN00030706_00_0000-OSNL-HD-2">
</Program_Details>
<Viewing_Info parentalrating="12" kw_violence="false" kw_drugs="false" kw_language="true" kw_sex="false" kw_fear="false" kw_discrimination="false">
</Viewing_Info>
<Crew>
<Crewmember Fullname="Rob Stich" Function="Director" />
<Crewmember Fullname="Josh Lawson" Function="Actor" />
<Crewmember Fullname="Rachael Taylor" Function="Actor" />
<Crewmember Fullname="Daniel Henshall" Function="Actor" />
</Crew>
</Program>
</Transmission>
</TRANSMISSIONS>

The final output will be something like this:

calendar-startdate| starttime | title
2015-03-01|08:00|Super Buddies
2015-03-01|09:20|Until She Came Along

I could not find any examples (with multiple attributes) that I could use to solve this problem. I am thankful for any comments or suggestions on how I can extract only certain attributes and create a data.frame. Thanks a lot for your time and help.

Using the solution provided by Scott answered in this post R XML select 2 attributes from a same node xmlAttrs() , I was able to find a quick and dirty solution.

doc <- xmlParse("xml file above")
dum1=as.data.frame(sapply(c("calendar-startdate", 'starttime'), function(x) xpathSApply(doc, '//Transmission_details',  xmlGetAttr, x)))
dum2=as.data.frame(sapply(c("title"), function(x) xpathSApply(doc, '//Program_Details',  xmlGetAttr, x)))
dum=cbind(dum1,dum2)

I am sure there is an another, a more elegant way to do it !

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM