I feel kind of stuck with the absence of a proper xml library for Elixir. Currently I use SweetXML which was ok for me more or less to parse the xml content that I receive. But it doen’t feel natural to use.
Now I have to generate xml content as well. I have use cases like cutting nodes (with xpath) from one document, enriching that part with other data and generating a new document. I don’t feel like I can do that easily with SweetXML or floki (that I really like).
I put something together that almost covers what I need, have to continue on it. Maybe someone is interested in the project as well:
For note, the BEAM has a built-in xml library called
xmerl (actually very powerful with multiple processing methods).
However, being built-in it is very erlang’y, so elixir XML implementations and/or wrappers are nice.
Would using XSLT be an option? https://hexdocs.pm/xslt/Xslt.html
I don’t know where the data you need to add comes from, but if it too is XML maybe you could use XSLT’s document() function? (As it happens I was doing this the other day, but from bash, not Elixir.)
We have a couple of datasource (SOAP/XML, FTP/XML). We transform this data to json that we use internally. Normally we transform one XML to one JSON document. But there are exceptions where we need to combine different XMLs to reuse our existing mappings. I am not keen to use XML but i have to.
Oh I know that all too well. ^.^;
This library can really use some more documentation.
Example: if I want to find certain elements via an XPath expression and then modify their contents and store the result as a new XML, how would I do that with Elixml?
I agree. The documentation is very basic and only showing some use cases with examples.
For your specific question:
You could parse the XML and manipulate the maps/array structure and store it as XML again. Not very convenient. Or we could think about having a map that works like the find and change nodes.
Why not open an issue with your feature request in the Github project and I will take care. Or you can contribute to the project if you like.
Well, problem is, I have a work assignment and I am not looking at it through the eyes of an OSS contributor. I am looking for a ready-made solution.
I can file an issue alright, but offering a PR is highly unlikely at this point.
Funny. I was about to embark on a little project that requires the parsing of a large XML file. Definitely great to see more efforts in this area!
While doing some research, I found Meeseeks:
@OvermindDL1 has recommended it in other post. Did you try it? If so, what was missing that you needed?
Thanks a lot
I use Meeseeks for both HTML and XML parsing, it’s awesome for both. The CSS and XPath selectors are supported on both HTML and XML parsing in it.
It does require having Rust’s compiler toolchain installed though.
What about mutating the XML structure and writing it back to disk? Can it do that in combination with XPath?
No. Meeseeks doesn’t do modification of a document, just search.
Shame. Seems I have to use one of the Erlang libraries then. They are quite cryptic and manual and verbose.
Yeah it is for reading only, which is all I need (I’m eating old XML and converting to better formats). ^.^
Heh, they aren’t too bad, you haven’t used C libs.
Sadly no. I was looking for a way to replace values by my own user-supplied function – not by a hardcoded value (example: reverse the value).
I coded it myself through
xmerl's streaming functions.