What XML is also very good at is: representing tagged text, what is called "mixed content" in XML terminology.
Just try to write the JSON equivalent of:
The JSON format was invented by Douglas Crockford.
If your document consists mainly in losely structured text with some annotation, you better use XML.{ "type": "div", "children": [ "The ", { "type": "a", "attributes": { "href": "https://www.json.org/" }, "children": [ "JSON format" ] }, " was invented by ", { "type": "a", "children": [ "Douglas Crockford" ] } ] }
I think I prefer the XML :-)
Edit: I agree that tagged text is a clear win for XML - for pretty much everything else I'd go for JSON.
Edit2: HN ate my formatting, but probably not a bad thing ;-)
["div", "The ", ["a", {"href": "https://www.json.org/"}, "JSON format"], " was invented by ", ["em", "Douglas Crockford"], "."]
Quite readable but it's a hell to parse. The first argument is the name of the element, but what is the second one? If it is a string or an array, it's the first child, but if it's an object, it's the attribute set?
Maybe something more like:
[
"div",
[
"The ",
[
"a",
{ "href": "https://www.json.org/" },
[ "JSON format" ]
],
" was invented by ",
[
"em",
"Douglas Crockford"
],
"."
]
]
With all children being encapsulated in an array...edit: though it again gets confusing when the 0 index is sometimes the element type and sometimes the straight text... so never mind I guess the problem persists.
[:div "The" [:a {:href "https://www.json.org/"} "JSON format"]
" was invented by " [:em "Douglas Crockford"] "."]
The fact that EDN[3] supports keywords makes it a bit easier to parse. Representing HTML in EDN this way was first done in a library called Hiccup[4], so it’s usually called “Hiccup” even when encountered outside of the original library.1: https://holmsand.github.io/reagent/
2: https://github.com/Day8/re-frame