代码之家  ›  专栏  ›  技术社区  ›  jax

使用XmlPullParser处理XML命名空间

  •  4
  • jax  · 技术社区  · 14 年前

    这是我用的 XmlPullParser 分析下面的文档。由于名称空间的原因,它不起作用,如何使用名称空间进行解析?

    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();
    }
    

    下面是我要分析的文档类型的示例

    <?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>
    

    我要分析 res dif 分开。

    1 回复  |  直到 10 年前
        1
  •  7
  •   Nikolay Ivanov    14 年前

    getPrefix

    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);
        }  
    

    prefix=res,name=resource  
    prefix=res,name=message  
    prefix=dif,name=person  
    prefix=dif,name=name  
    prefix=dif,name=description