当前位置:编程学习 > wap >>

android通过webservice访问远程数据库,xml文件解析的问题?

大家好,
我正在学习android。现在问题是,配置好的webservice已经可以联通,简单的string返回数据可以正常接收。
但是,实际应用中同事给我返回的webservice数据是xml datatable类型的,一部分如下:

  <?xml version="1.0" encoding="utf-8" ?> 
- <DataTable xmlns="http://tempuri.org/">
- <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
- <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Table1" msdata:UseCurrentLocale="true">
- <xs:complexType>
- <xs:choice minOccurs="0" maxOccurs="unbounded">
- <xs:element name="Table1">
- <xs:complexType>
- <xs:sequence>
  <xs:element name="Subject" type="xs:string" minOccurs="0" /> 
  <xs:element name="Content" type="xs:string" minOccurs="0" /> 
  <xs:element name="RealName" type="xs:string" minOccurs="0" /> 
  <xs:element name="Hits" type="xs:int" minOccurs="0" /> 
  <xs:element name="Joindate" type="xs:dateTime" minOccurs="0" /> 
  </xs:sequence>
  </xs:complexType>
  </xs:element>
  </xs:choice>
  </xs:complexType>
  </xs:element>
  </xs:schema>
- <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
- <NewDataSet xmlns="">
- <Table1 diffgr:id="Table11" msdata:rowOrder="0">
  <Subject>哥伦比亚警方称4名中国人被绑案系敲诈勒索哥伦比亚警方称4名中国人被绑案系敲诈勒索</Subject> 
  <Content><SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Arial,Microsoft Yahei,Simsun,sans-serif; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><SPAN style="LINE-HEIGHT: 23px; FONT-SIZE: 14px" class=Apple-style-span> <P style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 23px; BORDER-RIGHT-WIDTH: 0px; MARGIN: 15px 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; FONT-SIZE: 14px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px">新华网圣菲波哥大6月9日电(记者 黄勇贤)哥伦比亚空军新闻办公室9日发布公告说,空军已派出飞机在哥南部地区搜救8日<A style="COLOR: rgb(0,0,153); TEXT-DECORATION: none" href="http://news.sina.com.cn/c/2011-06-09/113122611784.shtml" target=_blank>被绑架的4名中国人质</A>。</P> <P style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 23px; BORDER-RIGHT-WIDTH: 0px; MARGIN: 15px 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; FONT-SIZE: 14px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px">  公报说,哥空军派出了先进的战斗、情报、侦查和攻击飞机,支援地面部队的搜救行动。</P> <P style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 23px; BORDER-RIGHT-WIDTH: 0px; MARGIN: 15px 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; FONT-SIZE: 14px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px">  中国驻哥伦比亚大使馆8日证实,中国中化集团下属哥伦比亚Emerald公司的4名中国员工当天在哥伦比亚南部卡格达省被武装分子绑架。哥伦比亚Emerald公司人士随后通过电话证实,该公司承包商的4名员工被武装人员绑架。</P> <P style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 23px; BORDER-RIGHT-WIDTH: 0px; MARGIN: 15px 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; FONT-SIZE: 14px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px">  卡格达省政府官员说,绑架是哥最大反政府武装“哥伦比亚革命武装力量”的“特奥菲洛·福雷罗 ”纵队所为,后者专门负责执行游击队的特别军事行动。</P> <P style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 23px; BORDER-RIGHT-WIDTH: 0px; MARGIN: 15px 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; FONT-SIZE: 14px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px">  卡格达省国家警察司令巴尔加斯上校9日在接受当地“蜗牛”电台采访时说:“我们认为,毫无疑问,这是一起以敲诈勒索为目的的绑架案件,目的是让受害公司支付经济利益。”</P> <P style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 23px; BORDER-RIGHT-WIDTH: 0px; MARGIN: 15px 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; FONT-SIZE: 14px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px">  截至目前,还没有被绑架中国人质的消息,哥政府军正在当地开展搜救行动。</P></SPAN></SPAN></Content> 
  <RealName>系统管理员</RealName> 
  <Hits>177</Hits> 
  <Joindate>2011-06-10T09:47:22.31+08:00</Joindate> 
  </Table1>
- <Table1 diffgr:id="Table12" msdata:rowOrder="1">
  <Subject>石家庄造假骗官干部因贪污行贿获刑14年(组图)</Subject> 


由于数据量不是很大,小弟就想通过dom解析。


   DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); 
   DocumentBuilder builder=factory.newDocumentBuilder(); 
   Document doc = builder.parse(f); 

于是就迷惑了,builder.parse()要求传递inputstream,intputsource或者file。但是通过soapobject序列化结果是object、soapobject类型。
怎么样把它转过去呢?
另外,webservice返回datatable,还是json好呢,感觉json简单点。
奇怪的是,object.toString()在android虚拟机上输出的结果是:

--------------------编程问答-------------------- 奇怪的是,object.toString()在android虚拟机上输出的结果和网页打开webservice的结果也不同。

求教~~~? --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- SoapObject result = (SoapObject)envelope.getResponse();
System.out.println(result.toString());
如果说你图片上得结果是在这里打印出来的,说明你的webservice有问题。 --------------------编程问答-------------------- 你确定传回来的是 XML ?! --------------------编程问答--------------------
引用 4 楼 tangfei_honesty 的回复:
SoapObject result = (SoapObject)envelope.getResponse();
System.out.println(result.toString());
如果说你图片上得结果是在这里打印出来的,说明你的webservice有问题。

webservice返回单个string输出并没有问题,另外在IE中打开webservice然后直接调用
是有结果的,内容就是第一个xml code。


引用 5 楼 sciolist 的回复:
你确定传回来的是 XML ?!


我也怀疑过,试图将object保存成文件通过文本编辑器查看内容,因为虚拟机问题未果。


返回的xml 是对的么?我已经贴在1楼了。

感谢2位的回答。 --------------------编程问答-------------------- 求解惑 --------------------编程问答-------------------- private List<Course> paserCourse(SoapObject result){
List<Course> courses = new ArrayList<Course>();
int iCount = result.getPropertyCount();
for(int i = 0; i < iCount; i++){
SoapObject child = (SoapObject)result.getProperty(i);
Course course = new Course();
course.courseId = child.getPropertyAsString("kcdm").trim();
course.teacher = child.getPropertyAsString("xm").trim();
course.name = child.getPropertyAsString("kcmc").trim();
course.schoolYear = child.getPropertyAsString("xn").trim();
course.schoolTerm = child.getPropertyAsString("xq").trim();
course.department = child.getPropertyAsString("yxmc").trim();
course.studentID = studentID;
courses.add(course);
}
Log.d(TAG, "获取课程数 :" + courses.size());

return courses;
}

这事我用来解析webservice返回结果的方法,webservice返回到结果是下面的形式,

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <M_GetKCInfoByStudentIDResponse xmlns="http://JCWebService.lib.sjtu.edu.cn/">
      <M_GetKCInfoByStudentIDResult>
        <KCInfo>
          <kcdm>string</kcdm>
          <kcmc>string</kcmc>
          <xm>string</xm>
          <xn>string</xn>
          <xq>string</xq>
          <yxmc>string</yxmc>
        </KCInfo>
        <KCInfo>
          <kcdm>string</kcdm>
          <kcmc>string</kcmc>
          <xm>string</xm>
          <xn>string</xn>
          <xq>string</xq>
          <yxmc>string</yxmc>
        </KCInfo>
      </M_GetKCInfoByStudentIDResult>
    </M_GetKCInfoByStudentIDResponse>
  </soap:Body>
</soap:Envelope>

(SoapObject)result.getProperty(i); 这一句获取到第i条<KCInfo>记录 --------------------编程问答--------------------
引用 8 楼 sun1916 的回复:
private List<Course> paserCourse(SoapObject result){
List<Course> courses = new ArrayList<Course>();
int iCount = result.getPropertyCount();
for(int i = 0; i < iCount; i++){
SoapObject child = (So……


我的返回结果是data table,里面并没有见到任何的soap ,envelope字样。不明白。。。。。 --------------------编程问答--------------------
引用 8 楼 sun1916 的回复:
private List<Course> paserCourse(SoapObject result){
List<Course> courses = new ArrayList<Course>();
int iCount = result.getPropertyCount();
for(int i = 0; i < iCount; i++){
SoapObject child = (So……


我的返回结果是data table,里面并没有见到任何的soap ,envelope字样。不明白。。。。。 --------------------编程问答-------------------- 做webservice那边使用data table保存sql结果的,跟这有没有关系? --------------------编程问答--------------------
引用 10 楼 layzind 的回复:
引用 8 楼 sun1916 的回复:
private List<Course> paserCourse(SoapObject result){
List<Course> courses = new ArrayList<Course>();
int iCount = result.getPropertyCount();
for(int i = 0; i < iCount; i++){
……
  那是webservice的访问示例返回结果, 意思就是返回的是这样的内容,但是你用soapObject是得不到完整的的xml内容的,所以要自己解析,比如你的datatable有8条记录,那么result.getPropertyCount()的值应该是5.(SoapObject)result.getProperty(1) 就得到了第2条table记录,getPropertyAsString("yxmc").trim();可以得到具体的某个属性的值, --------------------编程问答--------------------
引用 12 楼 sun1916 的回复:
引用 10 楼 layzind 的回复:

引用 8 楼 sun1916 的回复:
private List<Course> paserCourse(SoapObject result){
List<Course> courses = new ArrayList<Course>();
int iCount = result.getPropertyCount();
for(int i =……


很有帮助,谢谢你~~~
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,