我写的一个android客户端,需要通过访问Web服务器,返回XML,android客户端读取XML数据。
访问web URL如:http://xxxx.com/Mobile/MobileAjax.aspx?pAjaxType=Login&pUserID=adminsys&pPwd=123456访问XML:<?xml version="1.0" encoding="UTF-8"?>
<LoginInfo><Islogin>true</Islogin><UserID>AdminSys</UserID><UserName>超级管理员</UserName><OrgID>100</OrgID><OrgName>繁昌县组织部</OrgName></LoginInfo>我怎么写获取XML和解析XML信息的代码。
我是一个才做安卓的新手,大家帮忙
访问web URL如:http://xxxx.com/Mobile/MobileAjax.aspx?pAjaxType=Login&pUserID=adminsys&pPwd=123456访问XML:<?xml version="1.0" encoding="UTF-8"?>
<LoginInfo><Islogin>true</Islogin><UserID>AdminSys</UserID><UserName>超级管理员</UserName><OrgID>100</OrgID><OrgName>繁昌县组织部</OrgName></LoginInfo>我怎么写获取XML和解析XML信息的代码。
我是一个才做安卓的新手,大家帮忙
<?xml version="1.0" encoding="UTF-8"?>
<LoginInfo>
<Islogin>true</Islogin>
<UserID>AdminSys</UserID>
<UserName>超级管理员</UserName>
<OrgID>100</OrgID>
<OrgName>繁昌县组织部</OrgName>
</LoginInfo>
http://download.csdn.net/detail/summersrest/4582777
public class GetXMLfromInternet {
/**
* 得到数据
* @param args
* @return
*/
public final static InputStream getStream(String path) {
InputStream stream = null;
URL url;
try {
url = new URL(path);
//得到打开的链接对象
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(3*1000);
conn.setConnectTimeout(6*1000);
//设置请求超时与请求方式
stream = conn.getInputStream();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (ProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//从链接中获取一个输入流对象
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return stream;
} /**
* 解析xml
*/
@SuppressWarnings("unchecked")
public static void getXMLfromInternet(){
SAXReader reader = new SAXReader();
try {
Document document = reader.read(getStream("http://xxxx.com/Mobile/MobileAjax.aspx?pAjaxType=Login&pUserID=adminsys&pPwd=123456"));
Element root = document.getRootElement();
for(Iterator<Element> it1 = root.elementIterator(); it1.hasNext();){
Element element1 = it1.next();
System.out.println(element1.getName()+"-------------------------------------"+element1.getText());
for(Iterator<Element> it2 = element1.elementIterator(); it2.hasNext();){
Element element2 = it2.next();
System.out.println(element2.getName()+"-------------------------"+element2.getText());
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
System.out.println("dom4j document异常");
e.printStackTrace();
} }
}
List<LoginInfo> infos;
LoginInfo infoItem;
int currentstate = 0; public LoginInfoSAXHanlder() {
} public List<LoginInfo> getFeed() {
return infos;
} @Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
infos = new Vector<LoginInfo>(0);
infoItem = null;
} @Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub } /** XML解析器遇到XML里面的tag时就会调用这个函数。经常在这个函数内是通过localName俩进行判断而操作一些数据。 */
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
if (localName.equals("LoginInfo")) {
currentstate = 0;
infoItem = new LoginInfo();
return;
}
if (localName.equals("Islogin")) {
currentstate = Currentstate.Islogin;
return;
}
if (localName.equals("UserID")) {
currentstate = Currentstate.UserID;
return;
}
if (localName.equals("UserName")) {
currentstate = Currentstate.UserName;
return;
}
if (localName.equals("OrgID")) {
currentstate = Currentstate.OrgID;
return;
}
if (localName.equals("OrgName")) {
currentstate = Currentstate.OrgName;
return;
}
currentstate = 0;
} /**
* 这个方法与startElement()相对应,解析完一个tag节点后,执行这个方法。再找个例子中,如果解析一个item结束,
* 就将item添加到list中
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
if (localName.equals("ds")) {
infos.add(infoItem);
return;
}
} /**
* 解析完节点的内容后就会执行这个方法,并且参数ch[]就是节点的内容。这个例子里我们根据currentstate的不同,来判断当前那个tag的内容,
* 并放到合适的实体类中。
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
String theString = new String(ch, start, length);
switch (currentstate) {
case Currentstate.Islogin:
infoItem.setIslogin(Boolean.parseBoolean(theString));
currentstate = 0;
break;
case Currentstate.OrgID:
infoItem.setOrgID(Integer.parseInt(theString));
currentstate = 0;
break;
case Currentstate.OrgName:
infoItem.setOrgName(theString);
currentstate = 0;
break;
case Currentstate.UserID:
infoItem.setUserID(Integer.parseInt(theString));
currentstate = 0;
break;
case Currentstate.UserName:
infoItem.setUserName(theString);
currentstate = 0;
break; default:
return;
}
} class Currentstate { public static final int OrgName = 5;
public static final int OrgID = 4;
public static final int UserName = 3;
public static final int UserID = 2;
public static final int Islogin = 1; }
}解析的时候这样做 String str = "";//你的字符串
SAXParser parser = null;
List<LoginInfo> list = null; try {
parser = SAXParserFactory.newInstance().newSAXParser();
LoginInfoSAXHanlder parseXml = new LoginInfoSAXHanlder();
InputStream stream = new ByteArrayInputStream(str.getBytes());
parser.parse(stream, parseXml);
list = parseXml.getFeed();
} catch (Exception e) {
}
其中LoginInfo是XML文件的实体类, 这个不用我说了吧.
ul#sidebarlist -> li#first直接转换为以下XPath表达式:/html/body/div[@id='wraper']/div[@class='col x8 black']/
div[@class='side-vox last10']/ul[@class='sidebarlist']/li[@class='fisrt']或者更简洁的:/html/body/div[1]/div[4]/div[1]/div[1]/ul[1]/li[1]