2017-03-27 52 views
0

我在R中使用xml2包來解析我的xml文件。除了這個標籤名稱中有一個短劃線之外的所有東西都完美地工作。在R中解析包含特殊字符的標籤,其中包含「xml2」

XML示例:

<?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> 

我使用這行代碼來提取棱鏡中的文本:DOI節點(按預期工作):

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

相同的代碼提取然而,「引用計數」的值確實會返回「NA」而不是實際值。

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

我的猜測是,解析器與標籤內部的「 - 」混淆。有沒有可以避免這個問題?

回答

0

你試試更新xml2?我的Mac上使用XML2版本1.1.1它的工作原理:

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" 

如果這不起作用,你可以嘗試到指定NS爲

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

數據和包

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

如果我加載您的示例代碼,它完美的作品。我也在使用最新版本的軟件包。但是,該代碼不適用於真實的服務器響應。我會及時通知你的。 – NachtmannM

0

我無法按照我的意圖解決問題。最後,我的工作我倒過來使用XML2 :: as_list功能,選擇元件通過

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

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

非常感謝@ Floo0

0

遲到的這一段。這裏有一個解決方案,我發現可能會對其他人有所幫助:

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