İki XML dosyasını nasıl ayırabilirim?


75

Linux'ta iki XML dosyası arasında nasıl bir fark yaratabilirim?

İdeal olarak, bazı şeyleri katı şekilde yapılandırabilmek veya beyaz boşluk veya nitelik sırası gibi bazı şeyleri gevşetmek istiyorum.

Dosyaların işlevsel olarak aynı olmasına dikkat ediyorum, ancak özellikle de XML dosyası çok fazla satır çizgisine sahip değilse, kullanımın can sıkıcı olması kendine göre farklı.

Örneğin, aşağıdakiler benim için gerçekten iyi olmalı:

<tag att1="one" att2="two">
  content
</tag>

<tag att2="two" att1="one">
  content
</tag>

Yanıtlar:


86

Bir yaklaşım, her iki XML dosyasını da ilk olarak Canonical XML'e dönüştürmek ve sonuçları kullanarak karşılaştırmak olacaktır diff. Örneğin, xmllint , XML'yi kurallı hale getirmek için kullanılabilir.

$ xmllint --c14n one.xml > 1.xml
$ xmllint --c14n two.xml > 2.xml
$ diff 1.xml 2.xml

Veya bir astar olarak.

$ diff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)

1
Xmllint'deki --c14n anahtarını asla bilmiyordum. Bu kullanışlı.
qedi

18
Siz de tek bir çizgide yapabilirsinizvimdiff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
Nathan Villaescusa

ve xmllint OS X ile birlikte geliyor
ClintM

10
Durumunda belirgin değildi, c14n kısaltmasıdır standartlaştırma .
Brandin,

3
Her iki XML de (xmllint --format) farklı biçimlendirmeden önce ek bir adım uygulamak daha iyidir. Çünkü bu adım olmadan farkın gereğinden fazla farklılık gösterdiğini fark ettim.
ka3ak

23

Jukka'nın cevabı benim için işe yaramadı, ancak Kanonik XML'e işaret etti. Ne --c14n ne de --c14n11 bu nitelikleri sıraladı , ancak --exc-c14n anahtarının özellikleri sıraladığını fark ettim . --exc-c14n kılavuz sayfasında listelenmemiş, ancak komut satırında "W3C özel kurallı format" olarak tanımlanmıştır.

$ xmllint --exc-c14n one.xml > 1.xml
$ xmllint --exc-c14n two.xml > 2.xml
$ diff 1.xml 2.xml

$ xmllint | grep c14
    --c14n : save in W3C canonical format v1.0 (with comments)
    --c14n11 : save in W3C canonical format v1.1 (with comments)
    --exc-c14n : save in W3C exclusive canonical format (with comments)

$ rpm -qf /usr/bin/xmllint
libxml2-2.7.6-14.el6.x86_64
libxml2-2.7.6-14.el6.i686

$ cat /etc/system-release
CentOS release 6.5 (Final)

Uyarı --exc-c14n , xml üstbilgisini çıkarırken, --c14n orada değilse xml üstbilgisini hazırlar.


18

@Jukka Matilainen'ın cevabını kullanmaya çalıştım ama beyaz boşlukta sorun yaşadım (dosyalardan biri büyük bir astardı). Kullanımı --formatwhite-space farklılıkları atlamak için yardımcı olur.

xmllint --format one.xml > 1.xml  
xmllint --format two.xml > 2.xml  
diff 1.xml 2.xml  

Not: vimdiffxmls'nin yan yana karşılaştırılması için komutu kullanın .


Benim durumumda bir script tarafından two.xmlüretildi one.xml. Bu yüzden sadece senaryo tarafından nelerin eklendiğini / kaldırıldığını kontrol etmem gerekiyordu.
GuruM

1
İhtiyacım olan seçenek buydu. Sözde en kanonik versiyon --formatile birleştirilerek elde edilebilir --exc-c14n; Muhtemelen hala daha yavaş işleyecektir :(
ᴠɪɴᴄᴇɴᴛ

Cevabı yazdığımdan bu yana epey zaman geçti, ancak --exc-c14n bayrağını kullanmayı çok iyi hatırlıyorum. Bununla birlikte, çıktının bayrakla / bayraksız olarak dağıtılması farklılık göstermedi, bu yüzden kullanmayı bıraktı. Gereksiz / kullanılmayan bayrakları düşürmek işlemi daha hızlı hale getirebilir.
Aralık'ta GuruM

5
--exc-c14nOpsiyon niteliklerin sıralama belirtir. Özel dosyalarınızda özellikler muhtemelen zaten sıralanmıştı, ancak genel tavsiye kombinasyonu kullanmak olacaktır --format --exc-c14n.
14'te

6

Diffxml , temel işlevleri doğrular , ancak yapılandırma için pek çok seçenek sunmuyor gibi görünmektedir.

Düzenleme: Project Diffxml 2013'ten beri GitHub'a taşındı.


Henüz tam olarak orada değil, ama en azından umut verici görünüyor.
qedi

Ancak büyük dosyalar için kullanışlı değildir, her biri ~ 20k satır olmak üzere 40GB (RAM + SWAP) yedikten sonra öldü
Grzegorz

2013'teki son güncelleme ile projenin ölü gibi göründüğünü unutmayın
Mateusz Konieczny

4

Alt öğelerin sırasını da görmezden gelmek istiyorsanız, bunun için basit bir python aracı yazdım xmldiffs:

Öğe ve nitelik sırasını yok sayarak iki XML dosyasını karşılaştırın.

Kullanımı: xmldiffs [OPTION] FILE1 FILE2

Herhangi bir ilave seçenek diffkomuta iletilir .

Https://github.com/joh/xmldiffs adresinden alın


1

Python betiğim xdiff.py , XML dosyalarını karşılaştırmak için boşluk veya öznitelik sırasındaki (öğe sırasının aksine) farklılıkları yok sayar.

İki dosyayı karşılaştırmak için 1.xmlve 2.xmlaşağıdaki gibi komut dosyasını çalıştırmak olacaktır:

xdiff.py 1.xml 2.xml

OP'nin örneğinde, hiçbir şey çıkmaz ve çıkış durumunu döndürür 0(yapısal ya da metinsel farklılık yok).

Yapısal olarak farklı 1.xmlve 2.xmlfarklı durumlarda , GNU diff'in birleşik çıktısını taklit eder ve çıkış durumunu döndürür 1. Çıktıyı kontrol etmek için, örneğin -atüm bağlamı -nçıkarmak , bağlamsız -qçıktı almak ve çıktıyı tamamen bastırmak gibi (çıkış durumunu döndürürken) çeşitli seçenekler vardır .


0

Tüm metin tabanlı dosyaları karşılaştırmak için Beyond Compare'i kullanıyorum . Windows ve Linux için sürümler üretiyorlar.


1
Düz metin karşılaştırmaları, iki satırın farklı olduğunu söylerken, OP de aynı şekilde rapor edilmelerini istiyor.
ChrisF

4
yani kanonik olarak XML'i karşılaştırır .
Chris W. Rea,

1
Beyond Compare gerçekten bunun için berbat. XML öğelerinin farkında değil gibi görünüyor ve çoğunlukla sadece metin karşılaştırması yapıyor.
Rob K

Beyond Compare'in bir XML eklentisi var ama hiçbir zaman düzgün bir şekilde kuramadım, bu yüzden ... Nyeah ... Bu sayfaya geldim ve daha akıllı oldum ...
Erk

-1

Bizim SD Akıllı fark alıcı dayalı belgeleri karşılaştırır yapısına fiili düzeni tersine.

Bir XML Akıllı Ayırıcı var. XML için bu, etiketlerin ve içeriğin eşleşen sırasını ifade eder. Belirttiğiniz belirli parçadaki metin dizesinin farklı olduğunu not etmelidir. Şu anda, boşluk alanının normalize edilip edilmediğini ve anlamlı olup olmadığını belirten tag niteliklerinin XML kavramını anlamıyor.


1
SO profilinizde işvereniniz hakkında tam bir açıklama sağlarsınız; Cevabınız içinde kısa bir feragatnameyi de tercih ederdim :) BTW, değerlendirme kopyasını indirmeye çalıştım, ancak istek formu 'Akıllı' (JS yoluyla) Akıllı Ayırıcı ile birlikte XML'i (ikincisi) birleştirmek için yeterli Python ile birlikte, SD ürün sayfasına göre mümkün olsa da)?
ᴠɪɴᴄᴇɴᴛ

1
Ah. Hatırlatma için teşekkürler. Bu, bu konuda net bir SO politikası bulunmadan önceki zamanın bir cevabı. SO politikasına uygun cevaptaki ilişkiyi işaret etmek için cevabı revize ediyorum.
Ira Baxter

İndirme sayfasını kontrol edeceğim; Tüm canlı ürünlerimiz bu listeye girmiyor. Evet, bunlar var.
Ira Baxter

İndirme sayfasını kontrol ettim. Evet, XML akıllı ayırıcı orada değil. Ben arka odadaki adamları tamir etmeye çalışacağım; en fazla 1-2 hafta içinde orada olmalılar (bir birikimleri var, hepimiz değil miyiz?) Bu arada, eğer denemek istiyorsan, e-posta gönder (bio bakınız).
Ira Baxter

1
Bağlantılı sayfada "XML" kelimesi yoktur.
Mateusz Konieczny

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.