如何使用xml解析器解决java.lang.string无法转换为java.lang.integer android
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/36547375/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
how to resolve java.lang.string cannot be cast to java.lang.integer android with xml parser
提问by developer
I am trying to parse XML and display it into list view, but after running the app nothing happens -- the list is displayed but not with the XML data . I don't know if I am missing something.
我正在尝试解析 XML 并将其显示到列表视图中,但是在运行应用程序后什么也没有发生 - 列表显示但不包含 XML 数据。我不知道我是否遗漏了什么。
MainActivity class
主活动类
public class MainActivity extends ListActivity {
// All static variables
static final String URL = "http://api.androidhive.info/pizza/?format=xml";
// XML node keys
static final String KEY_ITEM = "item"; // parent node
static final String KEY_ID = "id";
static final String KEY_NAME = "name";
static final String KEY_COST = "cost";
static final String KEY_DESC = "description";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
ListView myList=(ListView)findViewById(android.R.id.list);
ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();
XMLParser parser = new XMLParser();
String xml = null; // getting XML
try {
xml = parser.getXmlFormUrl(URL);
} catch (IOException e) {
e.printStackTrace();
}
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
// looping through all item nodes <item>
for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
// adding each child node to HashMap key => value
map.put(KEY_ID, parser.getValue(e, KEY_ID));
map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
map.put(KEY_COST, "Rs." + parser.getValue(e, KEY_COST));
map.put(KEY_DESC, parser.getValue(e, KEY_DESC));
// adding HashList to ArrayList
menuItems.add(map);
}
// Adding menuItems to ListView
ListAdapter adapter = new SimpleAdapter(this, menuItems,
R.layout.activity_main,
new String[] { KEY_NAME, KEY_DESC, KEY_COST }, new int[] {
R.id.name, R.id.desciption, R.id.cost });
setListAdapter(adapter);
// selecting single ListView item
}
}
}
XmlParser class
XmlParser 类
public class XMLParser {
String result;
public String getXmlFormUrl(String link) throws IOException{
URL url=new URL(link.toString());
HttpURLConnection UrlConnection= (HttpURLConnection) url.openConnection();
int status=UrlConnection.getResponseCode();
if(status==200){
InputStream inputStream=UrlConnection.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream,"UTF8"));
StringBuilder stringBuilder= new StringBuilder();
String line;
while ((line=bufferedReader.readLine())!=null){
stringBuilder.append((line+"\n"));
}
result=stringBuilder.toString();
inputStream.close();
}
return result;
}
public Document getDomElement(String xml){
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xml));
doc = db.parse(is);
} catch (ParserConfigurationException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (SAXException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (IOException e) {
Log.e("Error: ", e.getMessage());
return null;
}
// return DOM
return doc;
}
public String getValue(Element item, String str) {
NodeList n = item.getElementsByTagName(str);
return this.getElementValue(n.item(0));
}
public final String getElementValue( Node elem ) {
Node child;
if( elem != null){
if (elem.hasChildNodes()){
for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
if( child.getNodeType() == Node.TEXT_NODE ){
return child.getNodeValue();
}
}
}
}
return "";
}
}
}
ActivityMain.xml
ActivityMain.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="android.prgguru.com.xmlparsingg.MainActivity">
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@android:id/list"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="73dp" />
</RelativeLayout>
logcat
日志猫
2/? E/ActivityThread: Service com.google.android.gms.car.CarService has leaked ServiceConnection com.google.android.gms.car.hr@3bb3cd94 that was originally bound here
android.app.ServiceConnectionLeaked: Service com.google.android.gms.car.CarService has leaked ServiceConnection com.google.android.gms.car.hr@3bb3cd94 that was originally bound here
at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1083)
at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:977)
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1779)
at android.app.ContextImpl.bindService(ContextImpl.java:1762)
at android.content.ContextWrapper.bindService(ContextWrapper.java:539)
at android.content.ContextWrapper.bindService(ContextWrapper.java:539)
at android.content.ContextWrapper.bindService(ContextWrapper.java:539)
at com.google.android.gms.common.stats.g.a(:com.google.android.gms:128)
at com.google.android.gms.common.stats.g.a(:com.google.android.gms:145)
at com.google.android.gms.car.hc.<init>(:com.google.android.gms:319)
at com.google.android.gms.car.CarChimeraService.onCreate(:com.google.android.gms:74)
at com.google.android.chimera.container.ServiceProxy.setImpl(:com.google.android.gms:119)
at com.google.android.chimera.container.ServiceProxy.onCreate(:com.google.android.gms:109)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2825)
at android.app.ActivityThread.access00(ActivityThread.java:156)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1434)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:211)
at android.app.ActivityThread.main(ActivityThread.java:5373)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
采纳答案by Vikrant Kashyap
You cannot directly change or reference your String
object to Integer
type because there is no parent-child
relationship between these two classes.
您不能直接更改或引用String
要Integer
键入的对象,因为parent-child
这两个类之间没有关系。
If you try to cast
a String
to a Integer
in such a way, it will raise a ClassCastException
.
如果你以这种方式尝试cast
aString
到 a Integer
,它会引发 a ClassCastException
。
String someValue = "123";
Integer intValue = (Integer) someValue; // ClassCastException Raise.
So if you want to change or reference a String
Variable to Integer
, you must use parsing techniques.
因此,如果要将String
变量更改或引用到Integer
,则必须使用解析技术。
int intValue = Integer.parseInt(someValue); //this code will work for this.
回答by marti201
If you have a String and you are sure that the only thing in it is a whole number without spaces, you can use Integer.parseInt(String)
to convert it to an integer. This method will throw an exception if the string isn't just the number.
如果您有一个 String 并且您确定其中唯一的内容是一个没有空格Integer.parseInt(String)
的整数,则可以使用将其转换为整数。如果字符串不仅仅是数字,则此方法将引发异常。