2012-04-12 20 views
5

Chciałbym uzyskać prawidłowy sposób analizowania niestandardowych tagów Androida za pomocą XmlResourceParser. Korzystam z Eclipse 3.6 z wtyczką Android i chciałbym, aby niektóre atrybuty, takie jak name, zostały rozszerzone o pełny ciąg od strings.xml.Android niestandardowy analizator składni XML nie rozpoznaje przestrzeni nazw Android

Oto index.xml, który jest przetwarzany w folderze res/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> 

Tutaj jest plik strings.xml w katalogu

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

res/values/ i fragment kodu, który przetwarza pierwszy index.xml się w XmlResourceParser:

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

Zmienna name zawiera null, ale shortName zawiera "o_2sq". Próbowałem również następujące bez powodzenia:

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

Co to jest poprawny sposób pisać zdanie tak, że nazwa zmiennej będzie zawierać "Organize two squares"?

Odpowiedz

1

Najlepsze rozwiązanie znalazłem przezwyciężyć ten problem.

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

Czy chodziło Ci o 'else {name = s '}'? Wydaje się, że to pozwoliłoby, aby ten atrybut był zasobem lub stałym ciągiem znaków, nie? –

+0

Potrzebowałem imienia, które nie jest puste w moim przypadku. Dlatego. –

4

Spróbuj tego:

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

Niezła próba. Daje coś lepszego: moja zmienna 'name' zawiera teraz ciąg' "@ 2131099651" '. Nie pewny dlaczego. –

+0

Jest to prawdopodobnie identyfikator zasobu ciąg. Spróbuj użyć getString (numer); metoda uzyskania łańcucha. – skywall

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

Myślę, że powyższy kod mógłby pomóc.

Powiązane problemy