在 R 中将具有 ASCII 实体名称的 XML 转换为基本的 XML

Convert in R a XML with ASCII Entity Names to a basic XML

我有以下 XML 文件:

<?xpacket begin="???" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.4-c006 80.159825, 2016/09/16-03:31:08        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
            xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/"
            xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
            xmlns:pdfx_1_="ns.adobe.org/pdfx/1.3/">
         <xmp:CreateDate>2021-05-30T11:17:35+02:00</xmp:CreateDate>
         <xmp:CreatorTool>TeX</xmp:CreatorTool>
         <xmp:ModifyDate>2021-05-30T12:12:25+02:00</xmp:ModifyDate>
         <xmp:MetadataDate>2021-05-30T12:12:25+02:00</xmp:MetadataDate>
         <pdfx:PTEX.Fullbanner>This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1</pdfx:PTEX.Fullbanner>
         <pdf:Producer>pdfTeX-1.40.20</pdf:Producer>
         <pdf:Trapped>Unknown</pdf:Trapped>
         <pdf:Keywords/>
         <dc:format>application/pdf</dc:format>
         <xmpMM:DocumentID>uuid:38d0617c-0385-5941-a87d-cc4a1e54bd76</xmpMM:DocumentID>
         <xmpMM:InstanceID>uuid:d056c61c-55c6-5f44-8c0e-fe6e911c2ed9</xmpMM:InstanceID>
         <pdfwe:dafra>&#xA;&#xA;&lt;?xml version="1.0"?&gt;&#xA;&#x9;&lt;dataframe name="expData" &#xA;&#x9;&#x9;xmlns="url"&#xA;&#x9;&#x9;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&#xA;&#x9;&#x9;xsi:schemaLocation="url"&gt;&#xA;&#x9;&#x9;&lt;column name="DATA" type="ratio"&gt;&#xA;&#x9;&#x9;&#x9;&lt;value&gt;14&lt;/value&gt;&#xA;&#x9;&#x9;&#x9;&lt;value&gt;18&lt;/value&gt;&#xA;&#x9;&#x9;&#x9;&lt;value&gt;21&lt;/value&gt;&#xA;&#x9;&#x9;&#x9;&lt;value&gt;35&lt;/value&gt;&#xA;&#x9;&#x9;&#x9;&lt;value&gt;44&lt;/value&gt;&#xA;&#x9;&#x9;&#x9;&lt;value&gt;50&lt;/value&gt;&#xA;&#x9;&#x9;&#x9;&lt;value&gt;3&lt;/value&gt;&#xA;&#x9;&#x9;&#x9;&lt;value&gt;5&lt;/value&gt;&#xA;&#x9;&#x9;&#x9;&lt;value&gt;7&lt;/value&gt;&#xA;&#x9;&#x9;&lt;/column&gt;&#xA;&#x9;&lt;/dataframe&gt;&#xA;&#xA;&#x9;&#x9;&#x9;</pdfx_1_:Dataframe>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                           
<?xpacket end="w"?>

如您所见,命名空间 pdfwe 的标签 Dataframe 中还有另一个 XML。我需要提取这个 XML 并将其转换为正常的 XML,没有像下面这样的 ASCII 实体名称:

<?xml version="1.0"?>
    <dataframe name="expData" 
        xmlns="url"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="url">
        <column name="DATA" type="ratio">
            <value>14</value>
            <value>18</value>
            <value>21</value>
            <value>35</value>
            <value>44</value>
            <value>50</value>
            <value>3</value>
            <value>5</value>
            <value>7</value>
        </column>
    </dataframe>

提取里面的东西 pdfwe:dafra 我正在使用 xml2 包的函数 xml_find_all(x, ".//pdfwe:dafra") 但我没有得到我想要的结果。

要转换实体名称,我正在使用函数 xml2::xml_text(xml2::read_xml(paste0("<x>", md, "</x>"))),但我也没有得到我想要的结果。

提前致谢!

解决方案是一个多步骤过程,提取数据库节点,转换为文本,清理然后使用 read_xml() 函数转换回 xml。

library(xml2)

page <- read_xml('<?xpacket begin="???" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.4-c006 80.159825, 2016/09/16-03:31:08">
   .....')  #read in the entire file

xml_ns(page)  #show namespaces

#extract the database
db <- xml_find_first(page, ".//pdfx_1_:Dataframe") 
#convert to text and strip leading whitespace
dbtext <- xml_text(db) %>% trimws()

#read the text in and convert to xml
xml_db <- read_xml(dbtext)
xml_ns(xml_db)  #show namespaces

#extract the requested information from database
#shown here for demonstration purposes
xml_db %>% xml_find_all(".//d1:column") %>% xml_find_all(".//d1:value") %>% xml_text()