2017-06-27 8 views
0

Ich habe ein XML zu analysieren und laden Sie es in einem Datenrahmen. Die XML hat doppelten Tag so mitXML manipulieren Konvertieren in Datenrahmen in R

xmldataframe < - xmlToDataFrame ("C: \ sample.xml") funktioniert nicht und wirft eine Fehlermeldung, Fehler in [<-.data.frame (*tmp*, i, Namen (Knoten [[i]]), Wert = c ("C",: doppelte Indizes für Spalten

Wenn ich die doppelten Tags manuell entfernen und versuchen, auszuführen, funktioniert. Aber das Problem ist, ich habe riesige Echtzeit XML, konnte ich nicht korrigieren alle von ihnen, weil ich die doppelten Tags nicht finden konnte.

  1. Gibt es einen Weg zu finde doppelte TAGs heraus, damit ich sie manuell entfernen kann?
  2. Wenn es Duplikate gibt, kann ich in dieselbe Spalte im Dataframe clubbed?

Hier ist das Beispiel 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

Sie können sicher doppelte Elemente über XSLT identifizieren, aber wenn Sie Ihre Eingabe XML * manuell große dann ist * Duplikate zu entfernen, ist vermutlich kein gangbarer Weg. Zum Glück kann XSLT damit auch helfen, aber (1) mir ist nicht klar, wie genau Sie mit solchen Duplikaten umgehen wollen, und (2) wir sind kein Code-Schreibdienst. –

+0

Danke für die XSLT-Option, ich werde das weiter untersuchen ... 1. Für Duplicate benötige ich nur 1 von vielen. 2. Sorry, ich möchte nicht nach dem Code fragen. –

Antwort

0

Betrachten Sie die Münchian Grouping in XSLT, um doppelte Elemente zu entfernen und dann R in der Ausgabe lesen zu lassen. Da R kein universelles Paket zum Ausführen der speziellen Sprache hat, kann R mit system() externe XSLT-Prozessoren aufrufen, sogar andere Skripte wie PHP/Python/Java, die XSLT 1.0 ausführen können. Im Folgenden sind Beispiele für R auf Unix (Linux/Mac) und Windows:

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> 

Rfür Unix xsltproc

library(XML) 

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

df <- xmlToDataFrame('Output.xml') 

Rmit für Windows mit 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"')) 

df <- xmlToDataFrame('Output.xml') 
Verwandte Themen