【问题标题】:Manipulate XML Convert into Dataframe in R在 R 中将 XML 转换为数据框
【发布时间】:2017-06-27 19:21:28
【问题描述】:

我有一个要解析的 XML 并将其加载到数据框中。 XML 有重复的标签,所以使用

xmldataframe [<-.data.frame(*tmp*, i, names(nodes[[i]]), value = c("C", ) 中的错误: 列的重复下标

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

  1. 有没有办法找出重复的 TAG,以便我可以手动删除?
  2. 如果有重复项,我可以将其加入数据框中的同一列吗?

这里是示例 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>

【问题讨论】:

  • 您当然可以通过 XSLT 识别重复元素,但如果您的输入 XML 很大,那么手动删除重复元素可能不是一个可行的选择。幸运的是,XSLT 也可以提供帮助,但是 (1) 我不清楚您究竟想如何处理此类重复,并且 (2) 我们不是代码编写服务。
  • 感谢 XSLT 选项,我将进一步探索... 1. 对于 Duplicate,我只需要其中的 1 个。 2.对不起,我的意思是要代码..

标签: r xml xslt


【解决方案1】:

考虑 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>

R 对于 Unix 使用 xsltproc

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 适用于使用 PowerShell 的 Windows 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"))

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2022-01-20
    • 2021-03-25
    相关资源
    最近更新 更多