在R中操纵XML转换为Dataframe

时间:2017-06-27 19:21:29

标签: r xml xslt

我有一个XML来解析并将其加载到数据帧中。 XML具有重复标记,因此使用

xmldataframe&lt; - xmlToDataFrame(“C:\ Sample.XML”)无效并抛出错误说 [<-.data.frame*tmp*,i,名称(节点[[i]]),值= c(“C”,:   列的重复下标

当我手动删除重复的标签并尝试执行它时。但问题是我有大量的实时XML,我无法纠正所有这些,因为我找不到重复的标签。

  1. 有没有办法找出重复的TAG,以便我可以手动删除?
  2. 如果有重复项,我可以在数据框中的同一列进行过分类吗?
  3. 以下是XML示例。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <IesEnhancedAttributes>
        <EnhancedAttribute>
            <action>C</action>
            <cleiCode>SDDFDFDFD</cleiCode>
            <physicalDescription>Small Form Factor(SFF), (e.g., SFP, GBIC, XFP, XPAK)</physicalDescription>
            <height_metric unit="mm">8.6</height_metric>
            <height_english unit="in">0.339</height_english>
            <width_metric unit="mm">13.7</width_metric>
            <width_english unit="in">0.539</width_english>
            <depth_metric unit="mm">56.5</depth_metric>
            <depth_english unit="in">2.224</depth_english>
                <depth_english unit="in">3.333</depth_english>
            <weight_metric unit="NS"></weight_metric>
            <weight_english unit="NS"></weight_english>
            <MaximumPowerUsage unit="NA"></MaximumPowerUsage>
            <operatingTemperature_metric_min unit="NS"></operatingTemperature_metric_min>
            <operatingTemperature_metric_max unit="NS"></operatingTemperature_metric_max>
            <operatingTemperature_english_min unit="NS"></operatingTemperature_english_min>
            <operatingTemperature_english_max unit="NS"></operatingTemperature_english_max>
            <storageTemperature_metric_min unit="NS"></storageTemperature_metric_min>
            <storageTemperature_metric_max unit="NS"></storageTemperature_metric_max>
            <storageTemperature_english_min unit="NS"></storageTemperature_english_min>
            <storageTemperature_english_max unit="NS"></storageTemperature_english_max>
            <humidity_min unit="NS">0</humidity_min>
            <humidity_max unit="NS">0</humidity_max>
            <altitude_metric_min unit="NS"></altitude_metric_min>
            <altitude_metric_max unit="NS"></altitude_metric_max>
            <altitude_english_min unit="NS"></altitude_english_min>
            <altitude_english_max unit="NS"></altitude_english_max>
            <alarmCapable>Y</alarmCapable>
            <PCNChange></PCNChange>
            <orderingCode>81.SOC12IR1131S</orderingCode>
            <maximumHeatDissipation_metric unit="NS"></maximumHeatDissipation_metric>
            <maximumHeatDissipation_english unit="NS"></maximumHeatDissipation_english>
            <frameSpacing_metric unit="NA"></frameSpacing_metric>
            <frameSpacing_english unit="NA"></frameSpacing_english>
        </EnhancedAttribute>
        <EnhancedAttribute>
            <action>C</action>
            <cleiCode>FDFDFDFDFDF</cleiCode>
            <physicalDescription>Small Form Factor(SFF), (e.g., SFP, GBIC, XFP, XPAK)</physicalDescription>
            <height_metric unit="mm">8.6</height_metric>
            <height_english unit="in">0.339</height_english>
            <width_metric unit="mm">13.7</width_metric>
            <width_english unit="in">0.539</width_english>
            <depth_metric unit="mm">56.5</depth_metric>
            <depth_english unit="in">2.224</depth_english>
            <weight_metric unit="NS"></weight_metric>
            <weight_english unit="NS"></weight_english>
            <MaximumPowerUsage unit="NA"></MaximumPowerUsage>
            <operatingTemperature_metric_min unit="NS"></operatingTemperature_metric_min>
            <operatingTemperature_metric_max unit="NS"></operatingTemperature_metric_max>
            <operatingTemperature_english_min unit="NS"></operatingTemperature_english_min>
            <operatingTemperature_english_max unit="NS"></operatingTemperature_english_max>
            <storageTemperature_metric_min unit="NS"></storageTemperature_metric_min>
            <storageTemperature_metric_max unit="NS"></storageTemperature_metric_max>
            <storageTemperature_english_min unit="NS"></storageTemperature_english_min>
            <storageTemperature_english_max unit="NS"></storageTemperature_english_max>
            <humidity_min unit="NS">0</humidity_min>
            <humidity_max unit="NS">0</humidity_max>
                <humidity_max unit="NS">1</humidity_max>
            <altitude_metric_min unit="NS"></altitude_metric_min>
            <altitude_metric_max unit="NS"></altitude_metric_max>
            <altitude_english_min unit="NS"></altitude_english_min>
            <altitude_english_max unit="NS"></altitude_english_max>
            <alarmCapable>Y</alarmCapable>
            <PCNChange></PCNChange>
            <HazardousMaterialIndicator>6</HazardousMaterialIndicator>
            <orderingCode>81.SOC12IR1131S</orderingCode>
            <frameSpacing_metric unit="NA"></frameSpacing_metric>
            <frameSpacing_english unit="NA"></frameSpacing_english>
        </EnhancedAttribute>
    </IesEnhancedAttributes>
    

1 个答案:

答案 0 :(得分:0)

考虑XSLT中的Muenchian分组删除重复元素,然后在输出中读取R。由于R没有运行专用语言的通用包,因此R可以使用system()调用外部XSLT处理器,甚至可以运行XSLT 1.0的其他脚本,如PHP / Python / Java。以下是Unix(Linux / Mac)和Windows上的R的示例:

<强> XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:outpu 1.t method="xml" indent="yes"/>

    <xsl:key name="elemid" match="EnhancedAttribute/*" 
             use="concat(count(../preceding-sibling::*) + 1, name())"/>

    <xsl:template match="/IesEnhancedAttributes">  
        <xsl:copy> 
            <xsl:apply-templates select="EnhancedAttribute"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="EnhancedAttribute"> 
        <xsl:copy>     
            <xsl:copy-of select="*[generate-id() = generate-id(key('elemid', 
                  concat(count(../preceding-sibling::*) + 1, name()))[1])]"/> 
        </xsl:copy>       
    </xsl:template>

</xsl:stylesheet>
使用xsltproc

R

library(XML)

setwd('/path/to/working/directory')
system(paste0('cd ', getwd(), ' && xsltproc -o Output.xml XSLTScript.xsl Input.xml'))

doc <- xmlParse('Output.xml')
df <- xmlToDataFrame(doc, nodes=getNodeSet(doc, "//EnhancedAttribute"))

R for Windows使用PowerShell script

library(XML)

system(paste0('Powershell.exe -File',
              ' "C:\\Path\\To\\PowerShell\\Script.ps1"',
              ' "C:\\Path\\To\\Input.xml"',
              ' "C:\\Path\\To\\XSLT\\Script.xsl"', 
              ' "C:\\Path\\To\\Output.xml"'))

doc <- xmlParse('Output.xml')
df <- xmlToDataFrame(doc, nodes=getNodeSet(doc, "//EnhancedAttribute"))