javaandroidxmlreadertag-soup

How to get an attribute from an XMLReader


I have some HTML that I'm converting to a Spanned using Html.fromHtml(...), and I have a custom tag that I'm using in it:

<customtag id="1234">

So I've implemented a TagHandler to handle this custom tag, like so:

public void handleTag( boolean opening, String tag, Editable output, XMLReader xmlReader ) {

    if ( tag.equalsIgnoreCase( "customtag" ) ) {

        String id = xmlReader.getProperty( "id" ).toString();
    }
}

In this case I get a SAX exception, as I believe the "id" field is actually an attribute, not a property. However, there isn't a getAttribute() method for XMLReader. So my question is, how do I get the value of the "id" field using this XMLReader? Thanks.


Solution

  • Here is my code to get the private attributes of the xmlReader by reflection:

    Field elementField = xmlReader.getClass().getDeclaredField("theNewElement");
    elementField.setAccessible(true);
    Object element = elementField.get(xmlReader);
    Field attsField = element.getClass().getDeclaredField("theAtts");
    attsField.setAccessible(true);
    Object atts = attsField.get(element);
    Field dataField = atts.getClass().getDeclaredField("data");
    dataField.setAccessible(true);
    String[] data = (String[])dataField.get(atts);
    Field lengthField = atts.getClass().getDeclaredField("length");
    lengthField.setAccessible(true);
    int len = (Integer)lengthField.get(atts);
    
    String myAttributeA = null;
    String myAttributeB = null;
    
    for(int i = 0; i < len; i++) {
        if("attrA".equals(data[i * 5 + 1])) {
            myAttributeA = data[i * 5 + 4];
        } else if("attrB".equals(data[i * 5 + 1])) {
            myAttributeB = data[i * 5 + 4];
        }
    }
    

    Note you could put the values into a map but for my usage that's too much overhead.