r-lib / xml2

Bindings to libxml2
https://xml2.r-lib.org/
Other
218 stars 83 forks source link

Is NaN the right value for xml_find_num() of an absent XPath? #435

Open MichaelChirico opened 8 months ago

MichaelChirico commented 8 months ago

Encountered when trying to convert some as.integer(xml_find_num()) usage. Consider:

x1 <- xml2::read_xml('<NODE line1="1">x</NODE>')
x2 <- xml2::read_xml('<NON-NODE line1="1">x</NON-NODE>')

xml2::xml_find_num(x1, "number(//NODE/@line1)")
# [1] 1
xml2::xml_find_num(x2, "number(//NODE/@line1)")
# [1] NaN
xml2::xml_find_int(x2, "number(//NODE/@line1)")
# Error in `xml2::xml_find_int()`:
# ! Element at path `number(//NODE/@line1)` must be a whole number, not `NaN`.
# Run `rlang::last_trace()` to see where the error occurred.
xml2::xml_find_first(x2, "//NODE/@line1")
# {xml_missing}
# <NA>

I would have expected NA to show up from xml_find_num() if xml_find_first() is returning xml_missing.

Either way, the inconsistency of xml_find_int() should be fixed. Since as.integer(NaN) is NA_integer_, shall we return that directly instead of looking at check_number_whole()?