我有一个XML来解析并将其加载到数据帧中。 XML具有重复标记,因此使用
xmldataframe< - xmlToDataFrame(“C:\ Sample.XML”)无效并抛出错误说
[<-.data.frame
(*tmp*
,i,名称(节点[[i]]),值= c(“C”,:
列的重复下标
当我手动删除重复的标签并尝试执行它时。但问题是我有大量的实时XML,我无法纠正所有这些,因为我找不到重复的标签。
以下是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>
答案 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"))