Elixml - XML library

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:

Marcus

1 Like

For note, the BEAM has a built-in xml library called xmerl (actually very powerful with multiple processing methods). :slight_smile:

However, being built-in it is very erlang’y, so elixir XML implementations and/or wrappers are nice. :slight_smile:

2 Likes

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.

1 Like

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.

1 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.

1 Like

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

1 Like

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.

3 Likes

What about mutating the XML structure and writing it back to disk? Can it do that in combination with XPath?

1 Like

No. Meeseeks doesn’t do modification of a document, just search.

1 Like

Shame. Seems I have to use one of the Erlang libraries then. :icon_eek: 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. :wink:

Might this be useful?

https://hexdocs.pm/xslt/0.1.1/Xslt.html

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.