xmlquery icon indicating copy to clipboard operation
xmlquery copied to clipboard

No error or panic when parsing non-XML

Open tuan-nxcr opened this issue 1 year ago • 4 comments

I was expecting Parse or Query to error out if I were to pass in something completely invalid, but it falls all the way through instead:

func TestXmlParse_1(t *testing.T) {
	//s := `<note>
	//<to>John</to>
	//<from>Smith</from>
	//<heading>Reminder</heading>
	//<body>Don't forget me this weekend!</body>
	//</note>`

	s := `{"NotXml":"ActuallyJson"}`

	parse, err := xmlquery.Parse(strings.NewReader(s))
	if err != nil {
		println(err.Error())
		t.Fail()
	}
	query, err := xmlquery.Query(parse, "//body/text()")
	if err != nil {
		println(err.Error())
		t.Fail()
	}
	println(query.Data)

}

using:

  • github.com/antchfx/xmlquery v1.3.11

tuan-nxcr avatar Aug 15 '22 23:08 tuan-nxcr

Add if query != nil {} to avoid throw a query is nil exception before println(query.Data)

zhengchun avatar Aug 16 '22 02:08 zhengchun

@zhengchun this is more of a question why Parse can proceed without any error when I give it invalid XML, not about how to handle a nil pointer exception.

tuan-nxcr avatar Aug 16 '22 02:08 tuan-nxcr

Sorry. In parse processing, we using https://pkg.go.dev/encoding/xml#NewDecoder to parsing, no extract additional method to check the input document whether is XML or JSON.

zhengchun avatar Aug 16 '22 12:08 zhengchun

@zhengchun

Thanks for reopening! Yes, I was just looking for some way to validate that we have at least well-formed XML before proceeding to parsing (similar to what is recommended by the authors of the gjson package https://github.com/tidwall/gjson#validate-json).

My workaround for this right now is to precede the xmlquery.Parse step with:

func isXml(someString string) bool {
    return xml.Unmarshal([]byte(someString), new(interface{})) == nil
}

(the above was inspired by this Stackoverflow answer, which I will say is quite unintuitive)

tuan-nxcr avatar Aug 16 '22 15:08 tuan-nxcr