java - utiliza - Manejo de espacios de nombres Xml con XmlPullParser
wikipedia xsd (1)
Puede distinguirlos por llamada al método getPrefix
. Algunos códigos de prueba:
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 para sus datos de prueba:
prefix=res,name=resource
prefix=res,name=message
prefix=dif,name=person
prefix=dif,name=name
prefix=dif,name=description
Aquí estoy usando XmlPullParser
para analizar el documento a continuación. No funciona debido a los espacios de nombres, ¿cómo puedo analizar con espacios de nombres?
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();
}
Aquí hay un ejemplo del tipo de documento que quiero analizar
<?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>
Quiero analizar res
y dif
separado.