2017-03-27 1 views
0

Ich verwende das Xml2-Paket in R, um meine XML-Datei zu analysieren. Alles funktioniert perfekt, außer diesem einen Tag, das einen Bindestrich im Tag-Namen hat.Parsen eines Tags mit Sonderzeichen mit "xml2" in R

XML-Beispiel:

<?xml version="1.0" encoding="UTF-8"?> 
<abstracts-retrieval-response xmlns="http://www.elsevier.com/xml/svapi/abstract/dtd" xmlns:ait="http://www.elsevier.com/xml/ani/ait" xmlns:ce="http://www.elsevier.com/xml/ani/common" xmlns:cto="http://www.elsevier.com/xml/cto/dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:prism="http://prismstandard.org/namespaces/basic/2.0/" xmlns:xocs="http://www.elsevier.com/xml/xocs/dtd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <coredata> 
    <prism:url>http://api.elsevier.com/content/abstract/scopus_id/85011891272</prism:url> 
    <dc:identifier>SCOPUS_ID:85011891272</dc:identifier> 
    <eid>2-s2.0-85011891272</eid> 
    <prism:doi>10.1186/s13638-017-0812-8</prism:doi> 
    <article-number>29</article-number> 
    <dc:title>Performance of emerging multi-carrier waveforms for 5G asynchronous communications</dc:title> 
    <prism:aggregationType>Journal</prism:aggregationType> 
    <srctype>j</srctype> 
    <citedby-count>0</citedby-count> 
    <prism:publicationName>Eurasip Journal on Wireless Communications and Networking</prism:publicationName> 
    <dc:publisher> Springer International Publishing </dc:publisher> 
    <source-id>18202</source-id> 
    <prism:issn>16871499</prism:issn> 
    <prism:volume>2017</prism:volume> 
    <prism:issueIdentifier>1</prism:issueIdentifier> 
    <prism:coverDate>2017-12-01</prism:coverDate> 
</coredata> 
</abstracts-retrieval-response> 

ich diese Zeile Code bin mit dem Text innerhalb des Prismas zu extrahieren: doi Knoten (wie gewünscht funktioniert):

xml2::xml_text(xml2::xml_find_first(intermediateXML,"//prism:doi")) 

Der gleiche Code zu extrahieren Der Wert von "citedby-count" gibt jedoch "NA" anstelle des tatsächlichen Werts zurück.

xml2::xml_text(xml2::xml_find_first(intermediateXML,"//citedby-count")) 

meine Vermutung ist, dass der Parser mit dem "-" innerhalb des Tags verwechselt wird. Ist es weg um dieses Problem zu vermeiden?

Antwort

0

Haben Sie versucht, xml2 zu aktualisieren? Auf meinem Mac mit xml2 Version 1.1.1 funktioniert es:

doc <- read_xml(txt) %>% 
    xml_find_first("/coredata") 

doc %>% xml_find_first("citedby-count") %>% xml_text # "0" 
doc %>% xml_find_first("//citedby-count") %>% xml_text # "0" 

Wenn dies nicht funktioniert, könnte versuchen, die NS als

doc %>% xml_find_first("citedby-count", ns = character()) %>% xml_text 

Daten und Pakete zu spezifizieren

require(xml2) 
require(magrittr) 
txt <- '<coredata> 
    <prism:url>http://api.elsevier.com/content/abstract/scopus_id/85011891272</prism:url> 
<dc:identifier>SCOPUS_ID:85011891272</dc:identifier> 
<eid>2-s2.0-85011891272</eid> 
<prism:doi>10.1186/s13638-017-0812-8</prism:doi> 
<article-number>29</article-number> 
<dc:title>Performance of emerging multi-carrier waveforms for 5G asynchronous communications</dc:title> 
<prism:aggregationType>Journal</prism:aggregationType> 
<srctype>j</srctype> 
<citedby-count>0</citedby-count> 
<prism:publicationName>Eurasip Journal on Wireless Communications and Networking</prism:publicationName> 
<dc:publisher> Springer International Publishing </dc:publisher> 
<source-id>18202</source-id> 
<prism:issn>16871499</prism:issn> 
<prism:volume>2017</prism:volume> 
<prism:issueIdentifier>1</prism:issueIdentifier> 
<prism:coverDate>2017-12-01</prism:coverDate></coredata>' 
+0

Wenn ich Ihren Beispielcode laden, funktioniert es perfekt. Ich benutze auch die neueste Version des Pakets. Der Code funktioniert jedoch nicht bei einer echten Live-Server-Antwort. Ich halte euch auf dem Laufenden. – NachtmannM

0

Ich konnte das Problem nicht so lösen, wie ich es beabsichtigt hatte. Am Ende habe ich meinen Weg um mithilfe der xml2 :: as_list Funktion und Auswahl des Elements durch

intermediateXML <- xml2::read_xml(serverResponse) 
listXML <- xml2::as_list(intermediateXML) 

listXML$coredata$`citedby-count`[[1]] 

Dank viele @ Floo0

0

spät auf dieser Szene angekommen. Hier ist eine Lösung, die ich für andere hilfreich finden könnte:

doc %>% xml_find_all("//*[name()='my-dash-tag']")