Java 获取可以使用XStream解析的xml的特定对象
我不熟悉XML解析,希望将web服务生成的XML文件转换为POJO列表。因为我已经使用JSon做了一些工作,并且发现它非常容易使用。对于XML,也有相同的过程,但我找不到遍历层次结构并到达要解析为POJO的特定节点的方法。当我用例子解释我的问题时。下面是XML格式的响应Java 获取可以使用XStream解析的xml的特定对象,java,android,web-services,xml-parsing,Java,Android,Web Services,Xml Parsing,我不熟悉XML解析,希望将web服务生成的XML文件转换为POJO列表。因为我已经使用JSon做了一些工作,并且发现它非常容易使用。对于XML,也有相同的过程,但我找不到遍历层次结构并到达要解析为POJO的特定节点的方法。当我用例子解释我的问题时。下面是XML格式的响应 <hash> <resp_status>1</resp_status> <message>success</message> <errors><
<hash>
<resp_status>1</resp_status>
<message>success</message>
<errors></errors>
<calendars>
<calendar>
<id>44</id>
<name>Air Force</name>
<expiry_date>2012-03-01</expiry_date>
<thumbnail_url>http://www.countdownyourgame.com/uploads/44_thumbnail.png</thumbnail_url>
</calendar>
<calendar>
<id>103</id>
<name>Akron</name>
<expiry_date>2012-02-01</expiry_date>
<thumbnail_url>http://www.countdownyourgame.com/uploads/103_thumbnail.png</thumbnail_url>
</calendar>
<calendar>
<id>16</id>
<name>Alabama</name>
<expiry_date>2012-03-01</expiry_date>
<thumbnail_url>http://www.countdownyourgame.com/uploads/16_thumbnail.png</thumbnail_url>
</calendar>
</calendars>
下面是日历文件名calendar.java中包含的日历对象的POJO
public class Calendar {
private String id, name, expiry_date, thumbnail_url;
Calendar() {
id = new String("");
name = new String("");
expiry_date = new String("");
thumbnail_url = new String("");
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getExpiryDate() {
return expiry_date;
}
public void setExpiryDate(String expiry_date) {
this.expiry_date = expiry_date;
}
public String getThumbnailUrl() {
return thumbnail_url;
}
public void setThumbnailUrl(String name) {
this.thumbnail_url = name;
}
}
要转换上面的JSon响应,我只需要以下代码
JSONObject json=new JSONObject(JsonResponceString);
for(int i=0;i<json.getJSONObject("hash").getJSONObject("calendars").getJSONArray("calendar").length();i++)
{
//by using refrenced jar of Gson
Calendars obj=new Gson().fromJson(json.getJSONObject("hash").getJSONObject("calendars").getJSONArray("calendar").getJSONObject(i).toString(), Calendar.class);
//ArrayList for calendar type objects
calendarList.add(obj);
}
对于上述使用XML的过程,有许多解析器,但我发现XStream是一个简单的解析器。
这里,如示例中的以下链接所示,有一个对象不是对象数组,它被转换为代码底部定义的POJO
我的问题是,如何遍历抛出整个XML响应并获得特定或所有calendar objectsXML对象,这些对象可以转换为类似于JSon中的字符串,然后作为参数传递给fromXML方法,以便解析为POJO
任何我自己编写一个类来使用字符串方法或正则表达式拆分日历对象的想法都将花费与选择简单解析相同的时间,因此请帮助我给出一个清晰的答案,即我尝试的过程是可能的还是不可能的,可能的,但不是这种方式……那么以什么方式
我还专门研究了其他JAXB,但它需要模式,尽管它甚至可以为您设计POJO,但如果我不需要解析整个XML,那么我所拥有的大多数解析器的问题是,它们可能解析整个响应,因此需要一个混乱的POJO结构。如果我错了,那么请建议我,但有一些可靠的例子…thankx或者您可以使用SAX解析器解析xml
终于找到了类似于JSon的方式。我希望这能帮助其他人@这就是我所要求的……我感谢你的帮助,但那不是我想要的
package com.samjanz.xmlparsing;
import java.util.ArrayList;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.samjanz.xmlparsing.helpers.MyConverter;
import com.samjanz.xmlparsing.helpers.MyHTTPConnector;
import com.samjanz.xmlparsing.pojos.Calendar;
import com.thoughtworks.xstream.XStream;
public class XmlParsingActivity extends Activity {
LinearLayout parent;
String serverResponce;
Document xmlDoc;
ArrayList<Calendar> calendarList;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
parent = (LinearLayout) findViewById(R.id.parent);
XStream xstream = new XStream();
xstream.alias("calendar", Calendar.class);
calendarList = new ArrayList<Calendar>();
String url = getText(R.string.calendar_url).toString();
// get DOC
xmlDoc = MyConverter.streamToDocument(MyHTTPConnector.UrlToStream(url));
NodeList nodeLst = xmlDoc.getElementsByTagName("calendar");
for (int i = 0; i < nodeLst.getLength(); i++) {
Node node = nodeLst.item(i);
if (node != null) {
Calendar obj = (Calendar) xstream.fromXML(MyConverter
.nodeToString(node));
calendarList.add(obj);
LayoutParams lparams = new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
TextView tv = new TextView(this);
tv.setLayoutParams(lparams);
tv.setText("\n\nLoop No:" + (i + 1) + "\nId = "
+ calendarList.get(i).getId() + "\nName = "
+ calendarList.get(i).getName() + "\nExpiry Date = "
+ calendarList.get(i).getExpiryDate()
+ "\nThumbnail Url = "
+ calendarList.get(i).getThumbnailUrl());
parent.addView(tv);
}
}
}
}JAXB不需要XML模式。既然您已经尝试过XStream,下面的文章可能会很有用。它使用JAXB和XStream将同一个对象模型映射到同一个XML文档:这不是我希望他们通过遍历XML文件并获取特定部分的方法得到的答案
package com.samjanz.xmlparsing;
import java.util.ArrayList;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.samjanz.xmlparsing.helpers.MyConverter;
import com.samjanz.xmlparsing.helpers.MyHTTPConnector;
import com.samjanz.xmlparsing.pojos.Calendar;
import com.thoughtworks.xstream.XStream;
public class XmlParsingActivity extends Activity {
LinearLayout parent;
String serverResponce;
Document xmlDoc;
ArrayList<Calendar> calendarList;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
parent = (LinearLayout) findViewById(R.id.parent);
XStream xstream = new XStream();
xstream.alias("calendar", Calendar.class);
calendarList = new ArrayList<Calendar>();
String url = getText(R.string.calendar_url).toString();
// get DOC
xmlDoc = MyConverter.streamToDocument(MyHTTPConnector.UrlToStream(url));
NodeList nodeLst = xmlDoc.getElementsByTagName("calendar");
for (int i = 0; i < nodeLst.getLength(); i++) {
Node node = nodeLst.item(i);
if (node != null) {
Calendar obj = (Calendar) xstream.fromXML(MyConverter
.nodeToString(node));
calendarList.add(obj);
LayoutParams lparams = new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
TextView tv = new TextView(this);
tv.setLayoutParams(lparams);
tv.setText("\n\nLoop No:" + (i + 1) + "\nId = "
+ calendarList.get(i).getId() + "\nName = "
+ calendarList.get(i).getName() + "\nExpiry Date = "
+ calendarList.get(i).getExpiryDate()
+ "\nThumbnail Url = "
+ calendarList.get(i).getThumbnailUrl());
parent.addView(tv);
}
}
}