It's also worthwhile to recap Scala's builtin XML API. A few introductory pages:
"XPath-like Queries Against XML Documents in Scala"
Quote: "Scala comes with a powerful, purely functional xml library, which supports xml matching functionality inspired by XPath. On a first look, it seems to be quite restricted compared to XPath, as you can only query for tag and attribute names, without adding conditions on tag content or attribute values ... But this is misguided: ... "
"Basic Scala XPath searching with \ and \\":
Quote: "Use the \ and \\ methods, which are analogous to the XPath / and // expressions."
"Scala: Deeper XML parsing, and extracting XML tag attributes"
Quote: "Combine the \ and \\ methods as needed to search the XML."
"How to extract data from XML nodes in Scala"
Quote: "Use the methods of the Scala Elem and NodeSeq classes to extract the data."
Peter Hunsberger <peter.hunsberger@gmail.com> schrieb am 6:09 Samstag, 24.Juni 2017:
I was going to mention the Scala implementation possibilities, glad to are aware of them. As well as the ability to use your own operators having implicit readers and writers makes Scala a joy for handling this kind of thing. They do require you to define the data model up front (at least the parts you care about) but once you have the classes defined usage becomes pretty trivial. You stop thinking about data formats, just direct usage as needed.
(2) A great challenge - and perhaps a hopeless one - would be to create an expressiveness which could at least be a far cry of what XPath offers. It is strange to say
N.walk(Axis.child("city")).flatMap(Axis.attribute("name").map(Node::stringValue)
when what you really want to say is
city/@name
Excellent point. However, dropping into another language does have all sorts of disadvantages: apart from the learning issues, there's the lack of compile-time syntax checking and type checking, the cost of dynamic compilation/interpretation, etc.
One thing to look at, perhaps, is how it translates into Scala, where you can define your own operators:
A.flatMap(B) --> A/B
A.attribute(B) --> A @ B
etc; and then we start to have something very XPath-like, but with a syntax that's compiled and validated by the host language.
--
Peter Hunsberger