2017-06-27 11 views
0

XMLを解析してデータフレームに読み込むXMLがあります。 XMLはそうXMLをRのデータフレームに変換する操作

xmldataframe <使用して、重複するタグがある - ( "C:\ sample.xmlに")xmlToDataFrameを、私は、名前を働いていないと*tmp*[<-.data.frameで エラーというエラーをスローする(ノード[[I]] )、値= c( "C"、: カラムの重複サブスクリプト

重複するタグを手動で削除して、それを実行しようとすると問題が発生します。重複したタグが見つからなかったため、すべてのタグが見つかりませんでした。

  1. 私は手動で削除することができます重複タグを見つける?
  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> 
+0

あなたは確かにXSLTを経由して、重複する要素を識別することができますが、あなたの入力XMLはその後、巨大である場合*手動*重複を除去することは、おそらく現実的な選択肢ではありません。幸いなことに、XSLTもそれを手助けすることができますが、(1)そのような重複をどのように処理したいのかがわかりません。(2)コード作成サービスではありません。 –

+0

XSLTオプションをお寄せいただきありがとうございます。私はそれをさらに深く探そうと思います... 1. Duplicateについては、多くのうち1つが必要です。 2.申し訳ありませんが、私はコードの一部を求めることを意味しません.. –

答えて

0

XSLTのMuenchian Groupingを使用して、重複する要素を削除し、次にRを出力に読み込むことを検討してください。 Rは特別な目的の言語を実行するための汎用パッケージを持っていないので、XSLT 1.0を実行できるPHP/Python/Javaのような他のスクリプトでもsystem()を外部XSLTプロセッサに呼び出すことができます。

XSLTのためxsltproc

library(XML) 

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

df <- xmlToDataFrame('Output.xml') 

Rを使用して

<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用:以下は、UNIX(Linuxの/ Mac用)およびWindows上の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"')) 

df <- xmlToDataFrame('Output.xml') 
関連する問題