2 unstable releases
Uses new Rust 2024
new 0.2.0 | Mar 21, 2025 |
---|---|
0.1.0 | Mar 21, 2025 |
#46 in #compare
27KB
578 lines
x-diff-rs
A library to compare XML files unorderedly.
This library implements the X-Diff algorithm from paper X-Diff: An Effective Change Detection Algorithm for XML Documents.
Example
use x_diff_rs::{
diff,
tree::XTree,
};
fn main() {
let text1 = r#"
<Profile>
<Customer>
<PersonName NameType="Default">
<NameTitle>Mr.</NameTitle>
<GivenName>George</GivenName>
<MiddleName>A.</MiddleName>
<SurName>Smith</SurName>
</PersonName>
<TelephoneInfo PhoneTech="Voice" PhoneUse="Work" >
<Telephone> <AreaCityCode>206</AreaCityCode>
<PhoneNumber>813-8698</PhoneNumber>
</Telephone>
</TelephoneInfo>
<PaymentForm>
...
</PaymentForm>
<Address>
<StreetNmbr POBox="4321-01">From hell</StreetNmbr>
<BldgRoom>Suite 800</BldgRoom>
<CityName>Seattle</CityName>
<StateProv PostalCode="98108">WA</StateProv>
<CountryName>USA</CountryName>
</Address>
<Address>
<StreetNmbr POBox="4321-01">1200 Yakima St</StreetNmbr>
<BldgRoom>Suite 800</BldgRoom>
<CityName>Seattle</CityName>
<StateProv PostalCode="98108">WA</StateProv>
<CountryName>USA</CountryName>
</Address>
</Customer>
</Profile>
"#;
let text2 = r#"
<Profile>
<Customer>
<PersonName NameType="Default">
<NameTitle>Mr.</NameTitle>
<GivenName>George</GivenName>
<MiddleName>A.</MiddleName>
<SurName>Smith</SurName>
</PersonName>
<TelephoneInfo PhoneTech="Voice" PhoneUse="Work" >
<Telephone> <AreaCityCode>206</AreaCityCode>
<PhoneNumber>813-8698</PhoneNumber>
</Telephone>
</TelephoneInfo>
<Address>
<StreetNmbr POBox="4321-01">From hell</StreetNmbr>
<BldgRoom>Suite 800</BldgRoom>
<CityName>Seattle</CityName>
<StateProv PostalCode="98108">WA</StateProv>
<CountryName>USA</CountryName>
</Address>
<Address>
<StreetNmbr POBox="1234-01">1200 Yakima St</StreetNmbr>
<BldgRoom>Suite 800</BldgRoom>
<CityName>Paris</CityName>
<StateProv PostalCode="98108">WA</StateProv>
<CountryName>USA</CountryName>
</Address>
<Status>Single</Status>
</Customer>
</Profile>
"#;
let tree1 = XTree::parse(&text1).unwrap();
let tree2 = XTree::parse(&text2).unwrap();
let difference = diff(&tree1, &tree2);
for d in difference {
println!("{d}");
}
}
Dependencies
~0.4–0.8MB
~20K SLoC