it-swarm.asia

كيف يمكنني فرق ملفين XML؟

على نظام Linux ، كيف يمكنني إنشاء فرق بين ملفي XML؟

من الناحية المثالية ، أود أن أكون قادرًا على تكوينه لبعض الأشياء الصارمة ، أو تخفيف بعض الأشياء ، مثل المسافة البيضاء أو ترتيب السمات.

غالبًا ما يهمني أن تكون الملفات متماثلة وظيفيًا ، ولكن الفرق في حد ذاته ، سيكون مزعجًا للاستخدام ، خاصةً إذا كان ملف XML لا يحتوي على الكثير من حواجز الأسطر.

على سبيل المثال ، يجب أن يكون ما يلي حقًا بخير بالنسبة لي:

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

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

تتمثل إحدى الطرق في تحويل كل من ملفات XML إلى XML الكنسي ، ومقارنة النتائج باستخدام diff. على سبيل المثال ، يمكن استخدام xmllint لتعريف XML.

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

أو كخط واحد.

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

لم تنجح إجابة Jukka بالنسبة لي ، لكنها أشارت إلى XML الكنسي. لا - c14n ولا - c14n11 قاموا بفرز السمات ، لكنني وجدت - قام المفتاح exc-c14n بتبديل السمات. - exc-c14n غير مدرج في صفحة الدليل ، ولكنه موصوف في سطر الأوامر كـ "W3C التنسيق الكنسي الحصري".

$ 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)

تحذير - exc-c14n يجرد رأس xml في حين أن --c14n يسبق رأس xml إن لم يكن هناك.

21
rjt

حاول استخدام إجابةJukka Matilainen ولكن واجهت مشاكل في المساحة البيضاء (كان أحد الملفات عبارة عن ملف مفرد ضخم). يساعد استخدام --format في تخطي الاختلافات في المساحة البيضاء.

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

ملاحظة: استخدم أمر vimdiff للمقارنة جنبًا إلى جنب مع xmls.

17
GuruM

Diffxml يحصل على الوظيفة الأساسية الصحيحة ، على الرغم من أنه لا يبدو أنه يقدم العديد من الخيارات للتهيئة.

تحرير: Project تم ترحيل Diffxml إلى GitHub منذ عام 2013.

6
dsolimano

إذا كنت ترغب أيضًا في تجاهل ترتيب العناصر الفرعية ، فقد كتبت أداة بيثون بسيطة لهذا xmldiffs:

قارن بين ملفين XML ، وتجاهل العنصر وترتيب السمة.

الاستعمال: xmldiffs [OPTION] FILE1 FILE2

يتم تمرير أي خيارات إضافية إلى الأمر diff.

احصل عليه على https://github.com/joh/xmldiffs

4
joh

يمكنني استخدام ما بعد المقارنة لمقارنة جميع أنواع الملفات النصية. أنها تنتج إصدارات لنظام التشغيل Windows و Linux.

0
Alan