ฉันจะแยกไฟล์ XML สองไฟล์ได้อย่างไร


75

บน Linux ฉันจะสร้างส่วนต่างระหว่างสองไฟล์ XML ได้อย่างไร

เป็นการดีที่ฉันจะสามารถกำหนดค่าให้บางสิ่งที่เข้มงวดหรือคลายบางสิ่งเช่นช่องว่างหรือคำสั่งแอตทริบิวต์

ฉันมักจะสนใจว่าไฟล์นั้นมีฟังก์ชั่นเหมือนกัน แต่แตกต่างกันโดยตัวของมันเองมันน่ารำคาญที่จะใช้โดยเฉพาะอย่างยิ่งถ้าไฟล์ XML ไม่มีการแพร่กระจายจำนวนมาก

ตัวอย่างเช่นสิ่งต่อไปนี้ควรเป็นจริงสำหรับฉัน:

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

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

คำตอบ:


86

วิธีการหนึ่งที่จะเป็นครั้งแรกที่เปิดไฟล์ 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)

1
ไม่เคยรู้เกี่ยวกับสวิตช์ --c14n ใน xmllint นั่นเป็นประโยชน์
qedi

18
คุณสามารถทำได้ในหนึ่งบรรทัดด้วยvimdiff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
นาธาน Villaescusa

และ xmllint มาพร้อมกับ OS X
ClintM

10
ในกรณีที่มันไม่ได้ชัดเจน c14n เป็นตัวย่อสำหรับรูปแบบบัญญัติ
Brandin

3
มันจะดีกว่าที่จะดำเนินการขั้นตอนเพิ่มเติมก่อนที่จะจัดรูปแบบแตกต่างของ XML ทั้งสอง (xmllint - รูปแบบ) เพราะฉันสังเกตเห็นว่าการไม่มีขั้นตอนนี้แตกต่างกันแสดงความแตกต่างมากกว่าที่จำเป็น
ka3ak

23

คำตอบของ Jukka ไม่ได้ผลสำหรับฉัน แต่ชี้ไปที่ Canonical 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 ไว้หากไม่มี


18

พยายามที่จะใช้คำตอบของ @Jukka Matilainen แต่มีปัญหากับพื้นที่สีขาว (หนึ่งในไฟล์คือซับขนาดใหญ่) การใช้--formatช่วยข้ามความแตกต่างของพื้นที่สีขาว

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

หมายเหตุ: ใช้vimdiffคำสั่งสำหรับการเปรียบเทียบ xml แบบคู่ขนาน


ในกรณีของฉันtwo.xmlถูกสร้างขึ้นone.xmlโดยสคริปต์ ดังนั้นฉันแค่ต้องการตรวจสอบสิ่งที่ถูกเพิ่ม / ลบโดยสคริปต์
GuruM

1
นี่คือตัวเลือกที่ฉันต้องการ สมมุติว่าเป็นเวอร์ชั่นที่ยอมรับได้มากที่สุดโดยการรวม--formatกับ--exc-c14n; อาจจะยังดำเนินการช้ากว่า :(
ᴠɪɴᴄᴇɴᴛ

มันค่อนข้างนานแล้วตั้งแต่ฉันเขียนคำตอบ แต่ฉันจำได้ไม่ชัดว่าใช้ธง --exc-c14n อย่างไรก็ตามการกระจายเอาท์พุทที่มี / ไม่มีแฟล็กแสดงให้เห็นว่าไม่มีความแตกต่างดังนั้นเพียงแค่หยุดใช้ การปล่อยแฟล็กที่ไม่จำเป็น / ไม่ได้ใช้อาจทำให้กระบวนการเร็วขึ้น
GuruM

5
--exc-c14nตัวเลือกระบุการเรียงลำดับของคุณลักษณะ ในแฟ้มของคุณโดยเฉพาะแอตทริบิวต์ที่อาจจะถูกจัดเรียงไว้แล้ว --format --exc-c14nแต่คำแนะนำทั่วไปจะใช้การรวมกัน
ᴠɪɴᴄᴇɴᴛ

6

Diffxmlทำให้ฟังก์ชันการทำงานพื้นฐานถูกต้อง แต่ดูเหมือนจะไม่มีตัวเลือกมากมายสำหรับการกำหนดค่า

แก้ไข: Project Diffxmlถูกย้ายไปที่ GitHub ตั้งแต่ปี 2013


ยังไม่ค่อยมี แต่ดูเหมือนว่าอย่างน้อยมีแนวโน้ม
qedi

แม้ว่าจะไม่เป็นประโยชน์สำหรับไฟล์ขนาดใหญ่ แต่เสียชีวิตหลังจากกิน 40GB (RAM + SWAP) เมื่อเปรียบเทียบสองไฟล์ ~ 20k บรรทัดต่อไฟล์
Grzegorz

โปรดทราบว่าโครงการดูเหมือนว่าจะตายแล้วพร้อมอัปเดตล่าสุดในปี 2013
Mateusz Konieczny

4

หากคุณต้องการที่จะเพิกเฉยต่อองค์ประกอบของเด็กฉันก็เขียนเครื่องมือหลามอย่างง่ายสำหรับสิ่งนี้ที่เรียกว่าxmldiffs:

เปรียบเทียบสองไฟล์ XML โดยไม่สนใจองค์ประกอบและลำดับแอททริบิวต์

การใช้งาน: xmldiffs [OPTION] FILE1 FILE2

ตัวเลือกพิเศษใด ๆ จะถูกส่งผ่านไปยังdiffคำสั่ง

รับได้ที่https://github.com/joh/xmldiffs


1

สคริปต์ Python ของฉันxdiff.pyสำหรับการเปรียบเทียบไฟล์ XML จะไม่สนใจความแตกต่างในช่องว่างหรือลำดับของแอททริบิว (ตรงกันข้ามกับลำดับองค์ประกอบ)

เพื่อเปรียบเทียบสองไฟล์1.xmlและ2.xmlคุณจะเรียกใช้สคริปต์ดังต่อไปนี้:

xdiff.py 1.xml 2.xml

ในตัวอย่างของ OP มันจะไม่แสดงผลใด ๆ และส่งคืนสถานะออก0(สำหรับไม่มีความแตกต่างทางโครงสร้างหรือข้อความ)

ในกรณีที่1.xmlและ2.xmlแตกต่างกันในเชิงโครงสร้างมันเลียนแบบเอาท์พุทแบบครบวงจรของ GNU diff 1และส่งกลับออกจากสถานะ มีตัวเลือกต่าง ๆ สำหรับการควบคุมเอาต์พุตเช่น-aสำหรับเอาต์พุตบริบททั้งหมด-nสำหรับเอาต์พุตไม่มีบริบทและ-qสำหรับระงับเอาต์พุตทั้งหมด (ขณะที่ยังคงส่งคืนสถานะทางออก)


0

ฉันใช้Beyond Compareเพื่อเปรียบเทียบไฟล์ที่เป็นข้อความทุกประเภท พวกเขาผลิตรุ่นสำหรับ Windows และ Linux


1
การเปรียบเทียบข้อความธรรมดาจะบอกว่าทั้งสองบรรทัดแตกต่างกันในขณะที่ OP ต้องการให้รายงานเหมือนกัน
ChrisF

4
เช่นCanonical เปรียบเทียบ XML
Chris W. Rea

1
Beyond เปรียบเทียบจริงๆครับสำหรับสิ่งนี้ ดูเหมือนจะไม่ทราบองค์ประกอบของ XML และทำการเปรียบเทียบข้อความเป็นส่วนใหญ่
Rob K

นอกเหนือจากการเปรียบเทียบมีปลั๊กอิน XML แต่ฉันไม่สามารถติดตั้งได้อย่างถูกต้องดังนั้น ... Nyeah ... ฉันมาที่หน้านี้และได้ฉลาด ...
Erk

-1

SD Smart Differencerของเราทำการเปรียบเทียบเอกสารตามโครงสร้างซึ่งต่างกับเค้าโครงจริง

มี XML Smart Differencer สำหรับ XML นั่นหมายถึงลำดับการจับคู่ของแท็กและเนื้อหา ควรสังเกตว่าสตริงข้อความในส่วนเฉพาะที่คุณระบุแตกต่างกัน ปัจจุบันไม่เข้าใจแนวคิด XML ของแอตทริบิวต์แท็กที่ระบุว่าช่องว่างเป็นแบบปกติกับนัยสำคัญหรือไม่


1
ในโปรไฟล์ SO ของคุณคุณได้เปิดเผยข้อมูลทั้งหมดเกี่ยวกับนายจ้างของคุณ ฉันต้องการข้อจำกัดความรับผิดชอบสั้น ๆ ในคำตอบของคุณด้วยเช่นกัน :) BTW ฉันพยายามดาวน์โหลดสำเนาการประเมินผล แต่แบบฟอร์มคำขอคือ 'สมาร์ท' (ผ่าน JS) เพียงพอที่จะปิดการใช้งาน XML ชุดค่าผสมกับ Smart Differencer ใช้ร่วมกับ Python แม้ว่าจะเป็นไปได้ตามหน้าผลิตภัณฑ์ SD)
ᴠɪɴᴄᴇɴᴛ

1
อา ขอบคุณสำหรับการเตือน นี่คือคำตอบจากเวลาก่อนที่จะมีนโยบาย SO ที่ชัดเจนเกี่ยวกับเรื่องนี้ ฉันกำลังแก้ไขคำตอบเพื่อส่งสัญญาณความสัมพันธ์ในคำตอบที่สอดคล้องกับนโยบาย SO
Ira Baxter

ฉันจะตรวจสอบหน้าดาวน์โหลด; ไม่ใช่ผลิตภัณฑ์จริงทั้งหมดของเราที่มีอยู่ในรายการนั้น ใช่สิ่งเหล่านี้มีอยู่
Ira Baxter

ฉันตรวจสอบหน้าดาวน์โหลด ใช่ XML smart differencer ไม่อยู่ที่นั่น ฉันจะให้พวกแบ็ครูมทำงานเพื่อแก้ไขสิ่งนั้น ควรจะมีในที่สุด 1-2 สัปดาห์ (พวกเขามีงานในมือเราทุกคนใช่หรือไม่) ในระหว่างนี้หากคุณต้องการลองส่งอีเมล (ดูประวัติ)
Ira Baxter

1
หน้าที่เชื่อมโยงไม่มีคำว่า "XML" อยู่ในนั้น
Mateusz Konieczny

-1

ไม่แน่ใจว่า (การพึ่งพาอาศัยกันของ) เครื่องมือออนไลน์นับเป็นวิธีการแก้ปัญหา แต่สำหรับสิ่งที่คุ้มค่าผมได้ผลงานที่ดีในเรื่องนี้เครื่องมือการเปรียบเทียบ XML ออนไลน์ มันใช้งานได้ง่าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.