2017-11-22 15 views
0

2つの複雑なXMLファイルがありますが、その違いを見つけたいと思います。一つだけ、私はからcompareXMLDocsを試してみました互い XMLファイルの違いを見つける方法R

異なる2つのXML

  • 値の中に存在している

    • タグ:私は必要なもの

      は見つけることですXMLパッケージですが、あまり満足いくものではありません。

      XML1 
      <root> 
          <first>name1</first> 
          <second>id1</second> 
          <third> 
          <third.1>something</third.1> 
          <third.2>something else</third.2> 
          </third> 
          <fifth>no differences</fifth> 
      </root> 
      
      
      XML2 
      <root> 
          <second>id2</second> 
          <third> 
          <third.1>something2</third.1> 
          <third.2>something else2</third.2> 
          </third> 
          <fourth>blahblah</fourth> 
          <fifth>no differences</fifth> 
      </root> 
      

      だから私はcompareXMLDocsと比較したときに、私が持っている:

      > compareXMLDocs(a, b) 
      $inA 
      first 
          1 
      
      $inB 
      fourth 
          1 
      
      $countDiffs 
      named integer(0) 
      

      を私はfirstタグのみXML1で使用され、fourthタグのみXML2で使用されていることをされていることを知っています。しかし、私は第三の値と第三の値が違うことは分かりません。それは私が探しているものです。私はcountDiffsのことを理解していません。ここではあまり役に立ちません。

      私もデータフレームでXMLを変換しようとしましたが、出力形式はあまり役に立ちません。ツリーが深い大きなXMLファイルが最悪になります。

      私はこの例のために期待される結果は、このようなデータフレームになり

      Path     A    B 
      /root/first   name1   NA 
      /root/second   id1    id2 
      /root/third/third.1 something  something2 
      /root/third/third.2 something else something else2 
      /fourth    NA    blahblah 
      
  • +0

    _「2つのXMLのうちの1つにのみ存在するタグ」_ ...ツリー内のノード位置によって表示されますか?一般に? _ "互いに異なる値" _ ...同じノード内の同じキーツリーノードレベル? – hrbrmstr

    答えて

    1

    データ:

    library(xml2) 
    library(tidyverse) 
    
    read_xml("<root> 
        <first>name1</first> 
        <second>id1</second> 
        <third> 
        <third.1>something</third.1> 
        <third.2>something else</third.2> 
        </third> 
        <fifth>no differences</fifth> 
    </root> 
    ") -> d1 
    
    read_xml(" 
    <root> 
        <second>id2</second> 
        <third> 
        <third.1>something2</third.1> 
        <third.2>something else2</third.2> 
        </third> 
        <fourth>blahblah</fourth> 
        <fifth>no differences</fifth> 
    </root> 
    ") -> d2 
    

    迅速なヘルパー関数を作成します。

    # NOTE: this will not handle attributes 
    as_path_df <- function(x) { 
        as_list(x) %>% 
        unlist() %>% 
        as.list() %>% 
        as_data_frame() %>% 
        gather(key, val) 
    } 
    

    ここです何か^^する:

    (d1_p <- as_path_df(d1)) 
    ## # A tibble: 5 x 2 
    ##    key   val 
    ##   <chr>   <chr> 
    ## 1   first   name1 
    ## 2  second   id1 
    ## 3 third.third.1  something 
    ## 4 third.third.2 something else 
    ## 5   fifth no differences 
    
    (d2_p <- as_path_df(d2)) 
    ## # A tibble: 5 x 2 
    ##    key    val 
    ##   <chr>   <chr> 
    ## 1  second    id2 
    ## 2 third.third.1  something2 
    ## 3 third.third.2 something else2 
    ## 4  fourth  blahblah 
    ## 5   fifth no differences 
    

    キー?

    setdiff(d1_p$key, d2_p$key) 
    ## [1] "first" 
    

    値?

    rename(d1_p, d1_val=val) %>% 
        left_join(rename(d2_p, d2_val=val)) %>% 
        mutate(same = (d1_val == d2_val)) 
    ## # A tibble: 5 x 4 
    ##    key   d1_val   d2_val same 
    ##   <chr>   <chr>   <chr> <lgl> 
    ## 1   first   name1   <NA>  NA 
    ## 2  second   id1    id2 FALSE 
    ## 3 third.third.1  something  something2 FALSE 
    ## 4 third.third.2 something else something else2 FALSE 
    ## 5   fifth no differences no differences TRUE 
    

    あなたはすぎて、キー欠落部分のための様々な_valまたはsame列にだけis.na()を使用することができます。しかし、setdiff()は超高速です。

    関連する問題