2012-04-12 190 views
5

我想用正确的方式解析自定义android标签与XmlResourceParser。我使用的是Eclipse插件的Eclipse 3.6,我希望name的一些属性可以从strings.xml扩展为完整的字符串。Android自定义XML解析器无法解析android名称空间

这是在res/xml/文件夹中正在解析的index.xml

<?xml version="1.0" encoding="utf-8"?> 
<Index xmlns:android="http://schemas.android.com/apk/res/android"> 
<Sheet 
    shortName="o_2sq" 
    android:name="@string/o_2sq" 
    instructions="" 
/> 
</Index> 

这里是在res/values/

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="o_2sq">Organize two squares</string> 
</resources> 

文件strings.xml和解析所述第一index.xml与XmlResourceParser代码片断:

String name = xpp.getAttributeValue(null, "android:name"); 
String shortName = xpp.getAttributeValue(null, "shortName"); 

可变name包含null,但shortName包含"o_2sq"。我也尝试没有成功如下:

String name = xpp.getAttributeValue("android", "name"); 

什么是写句话让变量名称将包含"Organize two squares"的正确方法是什么?

回答

1

最好的解决办法,我发现解决这一问题。

String s = xpp.getAttributeValue("http://schemas.android.com/apk/res/android", "name"); 
String name = null; 
if(s != null && s.length() > 1 && s.charAt(0) == '@') { 
    int id = Integer.parseInt(s.substring(1)); 
    name = getString(id); 
} else { 
    name = ""; 
} 
+1

你的意思是'else {name = s'}'?看起来像这样会允许该属性是一个资源或硬编码的字符串,不是? – 2013-11-24 01:15:29

+0

我需要的名字在我的情况下不为空。这就是为什么。 – 2013-11-25 06:37:57

4

试试这个:

String name = xpp.getAttributeValue("http://schemas.android.com/apk/res/android", "name"); 
+1

不错的尝试。它提供了更好的东西:我的变量'name'现在包含字符串'“@ 2131099651”'。不知道为什么。 – 2012-04-12 12:28:42

+0

它可能是字符串资源ID。尝试使用getString(number);方法来获取字符串。 – skywall 2012-04-12 12:37:27

1
final String NAMESPACE_ANDROID = "http://schemas.android.com/apk/res/android"; 
final int VALUE_NOT_SET = -1; 
int resId = parser.getAttributeResourceValue(NAMESPACE_ANDROID, "name", VALUE_NOT_SET); 
String value = null; 
if (VALUE_NOT_SET != resId) { 
    value = context.getString(resId); 
} 

我觉得上面的代码可以帮助你。