Mukulch15
Get elements with no textual values in XML in elixir
I am trying to parse the following XML doc using SweetXML library.
<A>
<B>23</B>
<B>34</B>
<B></B>
</A>
However when I try to parse the document using: xpath(~x"/A/B/text()"l)
I get the response ['23', '34']. Is there anyway I can get the list with nil value for the element having no text ? The response that I expect is: ['23', '34', nil] .
First Post!
NobbZ
As I understand your xpath you are explicitly asking for the text, but since there is non, you won’t get it in the result.
Most Liked
OvermindDL1
For note, Meeseeks follows the same pattern for XPath queries:
iex(14)> doc = Meeseeks.parse(xmlString, :xml)
#Meeseeks.Document<{...}>
iex(15)> Meeseeks.all(doc, xpath("/A/B/text()"))
[#Meeseeks.Result<{ 23 }>, #Meeseeks.Result<{ 34 }>]
iex(16)> Meeseeks.all(doc, xpath("/A/B")) |> Enum.map(&Meeseeks.one(&1, xpath("text()")))
[#Meeseeks.Result<{ 23 }>, #Meeseeks.Result<{ 34 }>, nil]
iex(17)> Meeseeks.all(doc, xpath("/A/B")) |> Enum.map(&Meeseeks.text(&1))
["23", "34", ""]
Mukulch15
So I was able to find two methods of achieving the required result.
-
stream_tags(xmldoc, :B) |> Stream.map( fn {:B, doc} -> doc |> SweetXml.xpath(~x"./text()") end) |> Enum.to_list -
xpath(xml, ~x"//A/B"l, number: ~x"text()") |> Enum.map(fn %{number: number} -> number end)
Thanks everyone for your responses.
tangui
The following XPath expression will return the string representation of your B elements:
/A/B/string()
or
/A/B/number()
if you’re expecting a number (NaN will be returned in the “empty” ,B/> case). You can test it here: Free Online XPath Tester / Evaluator - FreeFormatter.com
Haven’t tested with SweetXML though.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









