Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handling Xml namespaces with XmlPullParser

Here I am using XmlPullParser to parse the document below. It does not work because of the namespaces, how do I parse with namespaces?

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true);
XmlPullParser xpp = factory.newPullParser();

xpp.setInput(in, HTTP.UTF_8);
String namespace = xpp.getNamespace();

boolean inMessage = false;

int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
    //START TAGS
    if(eventType == XmlPullParser.START_TAG) {
        if(xpp.getName().equals(namespace+"resource")) {
            httpCode = Integer.valueOf( xpp.getAttributeValue(null, "code").trim() );
            type = xpp.getAttributeValue(null, "type").trim();
        } else if(xpp.getName().equals(namespace+"message")) {
            inMessage = true;
        }
    //TAG TEXT
    } else if(eventType == XmlPullParser.TEXT) {
        if(inMessage) {
            message = xpp.getText().trim();
            break; //CANCEL the iteration
        }
    } else if(eventType == XmlPullParser.END_TAG) {
        if(inMessage) {
            inMessage = false;
        }
    }
    eventType = xpp.next();
}

Here is an example of the sort of document I want to parse

<?xml version="1.0" encoding="UTF-8"?>
    <res:resource 
        xmlns:res="http://www.example.com/ns/server/resource"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.example.com/ns/server/resource resource.xsd "
        version="1" >
    <res:message httpCode="200" type="ok" >
        <![CDATA[Sample Success Response]]>
    </res:message>
    <dif:person 
        xmlns:dif="http://www.example.com/ns/server/resource"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.example.com/ns/server/person person.xsd "
        version="1" >
        <dif:name>test name</dif:name>
        <dif:description lang="en">test description</dif:description>
    </dif:person >
</res:resource>

I want to parse res and dif separately.

like image 220
jax Avatar asked Nov 24 '10 09:11

jax


1 Answers

You can distinguish them by call to getPrefix method. Some test code:

try {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser parser = factory.newPullParser();                     
        InputStream input = getResources().openRawResource(R.raw.test);
        parser.setInput(input, HTTP.UTF_8);     
        int eventType = parser.getEventType();
        while(eventType != XmlPullParser.END_DOCUMENT){             
            if(eventType == XmlPullParser.START_TAG){ 
                String prefix = parser.getPrefix();
                String name   = parser.getName();
                Log.i("XML", String.format("prefix=%s,name=%s",prefix,name));
                if( "dif".equals(prefix)){
                    handleDiff(parser);
                }else if ("res".equals(prefix)){
                    handleRes(parser);
                }
            }

            eventType = parser.next();
        }
    } catch (Exception e) {
        Log.e("XML","",e);
    }  

Logcat out put for your test data:

prefix=res,name=resource  
prefix=res,name=message  
prefix=dif,name=person  
prefix=dif,name=name  
prefix=dif,name=description  
like image 109
Nikolay Ivanov Avatar answered Oct 11 '22 19:10

Nikolay Ivanov