Как преобразовать вложенный XML-файл в фрейм данных? - PullRequest
0 голосов
/ 26 марта 2019

Я хочу преобразовать файл XML в фрейм данных. В этом XML-файле я хочу восстановить оба не вложенных элемента, если они вложены.

Я пытался проверить в нескольких онлайн-ресурсах, включая другие вопросы StackOverflow, но, будучи любителем в программировании на R, я не смог найти аналогичный пример для моего случая.

Это пример XML, который я имею в руках:

<?xml version="1.0" encoding="UTF-8"?>
<INSTITUTIONS>
   <INSTITUTION>
      <SORT>040706201 DIGNE-LES-BAINS MEDIATHEQUE INTERCOMMUNALE DES TROIS VALLEES.  DIGNE-LES-BAINS, ALPES DE HAUTE-PROVENCE</SORT>
      <DISPLAY>institution - Digne-les-Bains - Médiathèque intercommunale des Trois Vallées.  Digne-les-Bains, Alpes de Haute-Provence</DISPLAY>
      <BNF_STATUT display="validée">N</BNF_STATUT>
      <BNF_TYPE display="institution">1</BNF_TYPE>
      <BNF_UNICITE>04000 Médiathèque intercommunale des Trois Vallées.  Digne-les-Bains, Alpes de Haute-Provence</BNF_UNICITE>
      <XML_FIELD>
         <DONCODE_SET>
            <NOMORGBIB>DLL</NOMORGBIB>
            <CODEISIL>FR-040706201</CODEISIL>
            <PREFIXE>FR</PREFIXE>
         </DONCODE_SET>
         <DID_SEL>
            <CODERCR>040706201</CODERCR>
            <NOMETABLISSEMENT>Médiathèque intercommunale des Trois Vallées.  Digne-les-Bains, Alpes de Haute-Provence</NOMETABLISSEMENT>
            <NOMETABAFF>Bibliothèque municipale</NOMETABAFF>
            <NOMCOURT1>6710</NOMCOURT1>
            <NOMCOURT2>DIGNE-LES-BAINS - BM</NOMCOURT2>
            <NOMRESPONSABLE>Marlène Camilleri</NOMRESPONSABLE>
            <NOMTUTELLE>COMMUNES DE DIGNE-LES-BAINS, LA ROBINE, MARCOUS, ENTRAGES</NOMTUTELLE>
            <TYPEETABABES display="BM non classée">62</TYPEETABABES>
            <TYPEFAMABES display="Bibliothèque Municipale">6</TYPEFAMABES>
            <TYPEINST display="Bibliothèque médiathèque municipale ou intercommunale">1</TYPEINST>
         </DID_SEL>
         <ADRESSES_SEL>
            <ADRESSE_SET>
               <ADRES_CODEPOSTAL>04000</ADRES_CODEPOSTAL>
               <ADRES_LATITUDE>44.0916864</ADRES_LATITUDE>
               <ADRES_LONGITUDE>6.2341449</ADRES_LONGITUDE>
            </ADRESSE_SET>
         </ADRESSES_SEL>
         <ETAB_SEL>
            <DATECREATIONETAB>1816</DATECREATIONETAB>
            <HISTORIQUEETAB>La bibliothèque a été créee en 1816, d'abord départementale puis communale en 1824.
 Le fonds ancien provient des couvents de Haute-Provence, Récollets de Riez, Trinitaires de Digne, Minimes de Mane et de bibliothèques d'émigrés.
En janvier 2003, la bibliothèque devient intercommunale.
Le 16 septembre 2006, la nouvelle Médiathèque est inaugurée à l'Ilot Granoux.</HISTORIQUEETAB>
         </ETAB_SEL>
         <SERVICES_SEL>
            <SERVICE_SET>
               <TYPESERVICE display="Reproduction">4</TYPESERVICE>
               <SERVICE_REPRO display="Photocopie">1</SERVICE_REPRO>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Renseignements bibliographiques">7</TYPESERVICE>
               <SERVICE_RENS display="Par téléphone_RS_Par télécopie_RS_Par courrier_RS_Par courrier électronique">3/4/5/6</SERVICE_RENS>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Réservation de documents">6</TYPESERVICE>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Elaboration de bibliographies">8</TYPESERVICE>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Prêt entre bibliothèques">5</TYPESERVICE>
               <SERVICE_SPECIF>Prêt simple entre bibliothèques</SERVICE_SPECIF>
               <SERVICE_CONDUTIL>Photocopies</SERVICE_CONDUTIL>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Consultation sur place">1</TYPESERVICE>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Prêt à domicile">3</TYPESERVICE>
               <SERVICE_CONDUTIL>Tous publics</SERVICE_CONDUTIL>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Autre service">28</TYPESERVICE>
               <SERVICE_SPECIF>Orientation des demandeurs sur d'autres sources</SERVICE_SPECIF>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Catalogue en ligne">10</TYPESERVICE>
               <SERVICE_URL>http://www.mediatheque-digne.fr/opacwebaloes/index.aspx</SERVICE_URL>
            </SERVICE_SET>
         </SERVICES_SEL>
         <PUBLICATIONS_SEL>
            <PUBLI_GENE>Dépouillement des périodiques auxquels la Bibliothèque municipale est abonnée à partir de 1998</PUBLI_GENE>
            <PUBLI_BIBLIOGR>Cauvin (C.). Les origines de la bibliothèque de Digne. 1912, 28 p. (Bulletin de la société scientifique et littéraire des Basses-Alpes, t. XV). 
VIRE (M-M) - La Bibliothèque de Digne (Annales de Haute-Provence du n° 268 au n° 277). 
Patrimoine des bibliothèques de France : un guide des régions, t.6, Provence-Alpes-Côte d'Azur</PUBLI_BIBLIOGR>
         </PUBLICATIONS_SEL>
         <INFOCOMP_SEL>
            <CLASSIFICATION>Dewey pour la partie lecture publique, par format pour le fonds ancien.</CLASSIFICATION>
            <CATALOGUES>Catalogues informatisés, sauf fonds ancien et 1ère partie du XX.
Catalogue général des manuscrits tIX,</CATALOGUES>
            <CATALOGUECOLLECTIF_SET>
               <CATALOGUECOLLECTIF>Catalogue général des manuscrits des bibliothèques publiques de France. Départements — Tome IX.  pp 153-157 par Chaspoul. Digne (1-34)</CATALOGUECOLLECTIF>
            </CATALOGUECOLLECTIF_SET>
            <CATALOGUECOLLECTIF_SET>
               <CATALOGUECOLLECTIF_CTRL display="CCFr Manuscrits">ccfm</CATALOGUECOLLECTIF_CTRL>
               <CATALOGUECOLLECTIF_URL>http://ccfr.bnf.fr/portailccfr/jsp/index_view_direct_anonymous.jsp?record=eadcgm:EADI:FRCGMBPF-040706201-01a.xml</CATALOGUECOLLECTIF_URL>
            </CATALOGUECOLLECTIF_SET>
            <CATALOGUECOLLECTIF_SET>
               <CATALOGUECOLLECTIF_CTRL display="Sudoc PS">sups</CATALOGUECOLLECTIF_CTRL>
               <CATALOGUECOLLECTIF_URL>http://www.abes.fr/abes/page,366,reseau-sudoc-ps.html</CATALOGUECOLLECTIF_URL>
            </CATALOGUECOLLECTIF_SET>
         </INFOCOMP_SEL>
         <CATALOGUE_URL_LIGNE>http://www.mediatheque-digne.fr/opacwebaloes/index.aspx</CATALOGUE_URL_LIGNE>
      </XML_FIELD>
      <ARK_REF>/06871/0026710</ARK_REF>
   </INSTITUTION>

   <INSTITUTION>
      <SORT>130026201 ALLAUCH BIBLIOTHEQUE BERNARD MONGE.  ALLAUCH,  BOUCHES-DU-RHONE</SORT>
      <DISPLAY>institution - Allauch - Bibliothèque Bernard Monge.  Allauch,  Bouches-du-Rhône</DISPLAY>
      <BNF_STATUT display="validée">N</BNF_STATUT>
      <BNF_TYPE display="institution">1</BNF_TYPE>
      <BNF_UNICITE>13190 Bibliothèque Bernard Monge.  Allauch,  Bouches-du-Rhône</BNF_UNICITE>
      <XML_FIELD>
         <DONCODE_SET>
            <NOMORGBIB>DLL</NOMORGBIB>
            <CODEISIL>FR-130026201</CODEISIL>
            <PREFIXE>FR</PREFIXE>
         </DONCODE_SET>
         <ADRESSES_SEL>
            <ADRESSE_SET>
               <ADRES_CODEPOSTAL>13190</ADRES_CODEPOSTAL>
               <ADRES_COMMUNE>Allauch</ADRES_COMMUNE>
               <ADRES_LATITUDE>43.3345064</ADRES_LATITUDE>
               <ADRES_LONGITUDE>5.4833823</ADRES_LONGITUDE>
            </ADRESSE_SET>
         </ADRESSES_SEL>
         <SERVICES_SEL>
            <SERVICE_SET>
               <TYPESERVICE display="Accès bases de données externes">12</TYPESERVICE>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Reproduction">4</TYPESERVICE>
               <SERVICE_REPRO display="Photocopie">1</SERVICE_REPRO>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Réservation de documents">6</TYPESERVICE>
               <SERVICE_CONDUTIL>Pour les abonnés seulement</SERVICE_CONDUTIL>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Elaboration de bibliographies">8</TYPESERVICE>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Consultation sur place">1</TYPESERVICE>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Prêt à domicile">3</TYPESERVICE>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Portage de documents à domicile">9</TYPESERVICE>
               <SERVICE_CONDUTIL>Personnes handicapées qui en font la demande</SERVICE_CONDUTIL>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Catalogue en ligne">10</TYPESERVICE>
               <SERVICE_URL>http://biblio.allauch.com/search1.html</SERVICE_URL>
            </SERVICE_SET>
            <SERVICE_SET>
               <TYPESERVICE display="Compte utilisateur/lecteur">16</TYPESERVICE>
            </SERVICE_SET>
         </SERVICES_SEL>

   </INSTITUTION>

Из всех этих элементов я бы хотел восстановить следующие значения

NOMETABLISSEMENT, TYPEFAMABES

, что довольно просто, поскольку они не являются вложенными значениями, но я также хочу восстановить

ADRES_CODEPOSTAL, ADRES_LATITUDE, ADRES_LATITUDE, ADRES_LONGITUDE

И особенно те, которые у меня были самые трудные, я хочу восстановить все

TYPE_SERVICE display=> attributes under <SERVICES_SEL> <SERVICE_SET>

Это будет ожидаемый результат, который я хочу восстановить, с каждым type_service_display, представленным в одном столбце. Зная, конечно, что в моем наборе данных все библиотеки будут иметь различное количество «служб типов» (у некоторых будет больше, а у других только один или два), но я в порядке, если у меня есть значения NA для некоторых из этих столбцов.

Ради простоты я переставил столбцы и добавил "вкладки"

|NOMETABLISSEMENT|  |Médiathèque intercommunale des Trois Vallées etc.| |Bibliotheque X|
|TYPEFAMABES|   |6| |3|
|ADRES_CODEPOSTAL|  |4000|  |3900|
|ADRES_LATITUDE|    |44.0916864|    |44.556|
|ADRES_LONGITUDE|   |6.2341449| |6.777|
|TYPE_SERVICE DISPLAY 1|    |Reproduction|  |Reproduction|
|TYPE_SERVICE DISPLAY 1|    |"Renseignements bibliographiques|  |Réservation de documents|
|TYPE_SERVICE DISPLAY 2|    |Réservation de documents|  |NA|
|TYPE_SERVICE DISPLAY 2|    |Elaboration de bibliographies| |NA|

Я полагаю, что для ответа потребуется в основном XPATH, чтобы он оставался рекурсивным, но я пока не могу написать что-то такого сложного, поэтому любая помощь будет принята с благодарностью.

Большое спасибо!

Камило

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...