java - 使用 XmlPullParser 处理 Xml 命名空间

标签 java android xml xml-parsing xmlpullparser

我在这里使用 XmlPullParser 来解析下面的文档。由于 namespace ,它不起作用,我如何使用 namespace 进行解析?

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>

我想分别解析resdif

最佳答案

您可以通过调用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);
    }  

为您的测试数据输出的 Logcat:

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

关于java - 使用 XmlPullParser 处理 Xml 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4265199/

相关文章:

java - 关于日期格式

xml - 为默认命名空间中的元素添加了 tag0 命名空间

c# - 将 xml 文档附加到 C# 中的 xml 节点?

java - GWT 错误!类型 org.w3c.dom.Node 没有可用的源代码

java - 使用资源 URL 删除 AWS S3 资源 - Java SDK

java - 我如何使用 git 在 Intellij 中管理 workspace.xml

java - 我应该使用哪种 java swing 布局

Android:在从另一个 Activity 扩展的 Activity 中使用ButterKnife

android - Android.mk中 "call"的 "LOCAL_PATH := $(call my-dir)"是什么?

android - 在 android 小部件上需要帮助