Search code examples
xmlexceptionhaxexmlnodeneko

Xml.nodeValue causes "Bad node type" error


class Main extends Sprite 
{

    public function new() 
    {
        super();

        try 
        {
            var xml:Xml = Xml.parse("<count>6</count>");

            trace(xml.nodeType);

            for (x in xml.elementsNamed("count"))
            {
                trace(x.nodeName);
                trace(x.nodeType);
                trace(x.nodeValue);
            }
        } 
        catch (err:Dynamic) 
        {
            trace(err);
            Sys.exit(1);
        }
    }

}

Output:

Main.hx:23: 6

Main.hx:27: count

Main.hx:28: 0

Main.hx:34: Bad node type, unexpected 0

I can't fully understand the principle of operation of nodeValue property. Because of that, I can't solve my problem. Any help here?

P.S. My configuration is: Haxe + OpenFL targeting Neko.


Solution

  • elementsNamed() returns nodes of type XmlType.Element, and the docs for nodeValue explicitly state:

    Returns the node value. Only works if the Xml node is not an Element or a Document.

    So nodeValue will work for all other possible XmlType values. In your case, the value you want to retrieve is stored in a XmlType.PCData node, and you can access it using firstChild():

    for (x in xml.elementsNamed("count"))
    {
        trace(x.firstChild().nodeType); // 1 - XmlType.PCData
        trace(x.firstChild().nodeValue); // 6
    }
    

    The full structure of <count>6</count> looks like this:

    [XmlType.Document] -> [XmlType.Element <count>] -> [XmlType.PCData 6]