【问题标题】:Parsing a tag containing special characters with "xml2" in R在R中解析包含带有“xml2”的特殊字符的标签
【发布时间】:2017-03-27 13:25:41
【问题描述】:

我正在使用 R 中的 xml2 包来解析我的 xml 文件。一切正常,除了这个标签,标签名称中有一个破折号。

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>

我正在使用这行代码来提取 prism:doi 节点内的文本(按预期工作):

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

提取“citedby-count”值的相同代码返回“NA”而不是实际值。

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

我的猜测是,解析器与标签内的“-”混淆了。有没有办法避免这个问题?

【问题讨论】:

    标签: r xml special-characters hyphenation xml2


    【解决方案1】:

    您是否尝试更新xml2?在我使用 xml2 版本 1.1.1 的 Mac 上,它可以工作:

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

    【讨论】:

    • 如果我加载您的示例代码,它会完美运行。我也在使用最新版本的软件包。但是,该代码不适用于真实的实时服务器响应。我会及时通知你。
    【解决方案2】:

    我无法按照我想要的方式解决问题。最后,我通过使用 xml2::as_list 函数并通过

    选择元素来解决问题
    intermediateXML <- xml2::read_xml(serverResponse)
    listXML <- xml2::as_list(intermediateXML)
    
    listXML$coredata$`citedby-count`[[1]]
    

    非常感谢@Floo0

    【讨论】:

      【解决方案3】:

      在这一幕上迟到了。这是我发现可能对其他人有帮助的解决方案:

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

      【讨论】:

        猜你喜欢
        • 2014-06-25
        • 2011-08-21
        • 1970-01-01
        • 2012-04-28
        • 1970-01-01
        • 2022-01-07
        • 2018-11-07
        • 1970-01-01
        • 2018-05-22
        相关资源
        最近更新 更多