Everything runs in your browser. We never see your XML. How we prove it β
XML Diff β Compare XML Files Online
Two XML documents, compared as trees. Attribute shuffles and reformatting drop out; changed elements, attributes and text stay in.
How XML documents are matched element by element
The XML specification settles one argument for us outright: the order of attribute specifications in a start-tag is not significant. `<account id="88" type="savings">` and `<account type="savings" id="88">` are the same element, so every attribute set is normalized into a sorted map and a reshuffled tag is never taken for an edit. Child elements are the opposite case β sequence is part of what a document says, and lifting a `<LineItem>` above its sibling gets reported. Namespaces are handled by meaning rather than spelling. A prefix is only a local nickname, so a file binding `xmlns:soap` and one binding `xmlns:env` to the same URI line up element for element; a file that keeps its prefix but repoints it at a new URI does not, and you see that where it happens.
The walk reports at three levels: elements gained or lost, attribute values rewritten, and text nodes altered, each entry carrying the route down to it. Running underneath is a pretty-printed pairing of both documents, indented on the same rules, which is what makes a message delivered as one unbroken 40,000-character line readable at all. Parsing and comparison sit in a Web Worker on your machine. An unclosed tag or a bare ampersand raises no exception β you get a text comparison and a note naming the side the parser refused. When the file in hand is really source code, an XSLT stylesheet or a build script, Code Diff puts syntax highlighting over the same line engine.
Message content stays in your browser
XML is still the wire format of finance, insurance and government integration, which means the documents worth diffing tend to be the worst ones to leak: an ISO 20022 credit transfer holding an IBAN and a debtor name, a SOAP envelope with a WS-Security assertion in its header, a claims file describing a named individual. Pasting any of that into a hosted converter is a disclosure event. Here there is nothing to disclose to β no ingestion route, no login, no retention, just a parser running in your tab. Open your browser's network tab while you use this tool β you'll see no request carries your content. Our method for proving that is documented.
Documents people bring to this page
- An integration developer at a bank puts a rejected pain.001 payment instruction next to one the clearing house accepted last week, and finds a `Ccy` attribute hung on the wrong amount element, three levels below where anyone was looking.
- A middleware consultant on a failover drill captures the same SOAP request as handled by the primary site and the disaster-recovery site. Differing prefixes collapse to nothing, leaving one header element that DR never adds.
- An Android release engineer after an SDK bump compares the merged manifest from the last shipping build with the current one, and catches a transitive dependency quietly requesting a location permission that would have stalled the store review.
- A podcast producer migrating hosts checks the old feed against the one the new platform generates, verifying that every item GUID survived intact and that the iTunes namespace elements were not quietly dropped somewhere in the translation.
Frequently asked questions
Does rearranging attributes count as a difference?
Never. Attribute order carries no meaning in XML, so both sides are canonicalized into sorted attribute maps before anything is compared. Adding, removing or editing an attribute value is reported; writing the same attributes in a new sequence is not. Element order, by contrast, is meaningful and compared as written.
How are namespaces treated?
By URI, not by prefix. Two documents binding different prefixes to the same URI use the same vocabulary and match cleanly, which is what you want when comparing output from two toolchains. If a prefix stays but its bound URI changes, the elements under it stop matching and the difference is shown.
What are the size limits?
Comparison recalculates as you type up to roughly 1 MB of combined input; past that a Compare button appears so a large document does not re-parse on every keystroke. Around 10 MB a side works well and 50 MB is the ceiling. Element count matters more than byte count.
Is any part of the document sent to a server?
No part of it. There is no backend that could accept an upload, no account system and no stored history; the DOM parser and the tree comparator execute inside your browser tab, and the result disappears when you close it. The privacy page shows how to confirm this from DevTools in a minute.
What happens to comments, CDATA and whitespace between tags?
Insignificant whitespace between elements is normalized away, so reindenting a document produces no findings. Text content inside an element is compared as written, including text held in CDATA sections. Comments are not part of the structural comparison β if a comment change matters to your review, read it in the text view below the change list.
Related tools
- JSON DiffThe modern counterpart: nested objects compared by path, key order ignored.
- YAML DiffConfig trees with anchors resolved, built for clusters and pipelines.
- Code DiffHighlighted source comparison when the file is a program, not a message.
- Text CompareUnstructured two-pane comparison at line, word or character precision.