c# webservice
内容是返回一个ds。
我们都知道返回的webservice 是以xml文件的形式展现给我们的。
dataset 值c#里的数据集 好比与table集合
webservice 方法里面是这样处理dataset ds的 。
如果
return ds;
则在web浏览器 访问是这种形式的:<?xml version="1.0" encoding="utf-8" ?> 
- <DataSet xmlns="http://www.digital-star.com.cn/">
- <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:UseCurrentLocale="true">
- <xs:complexType>
- <xs:choice minOccurs="0" maxOccurs="unbounded">
- <xs:element name="Table">
- <xs:complexType>
- <xs:sequence>
  <xs:element name="人员编号" type="xs:string" minOccurs="0" /> 
  <xs:element name="中文姓名" type="xs:string" minOccurs="0" />
 <xs:element name="撤销时间" type="xs:string" minOccurs="0" /> 
  <xs:element name="相片" type="xs:string" 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="">
- <Table diffgr:id="Table1" msdata:rowOrder="0">
  <人员编号>123465345</人员编号> 
  <中文姓名>张良</中文姓名> 
  <英文姓名 /> 
  <别名或绰号 /> 
  <性别>1</性别> 
  <出生日期>2009-01-08T10:10:39+08:00</出生日期> 
<移交地址省市县区>张家口</移交地址省市县区> 
  <移交地址详细地址>潍坊市</移交地址详细地址> 
  <撤销时间>19520827175518</撤销时间> 
  </Table>
  </NewDataSet>
  </diffgr:diffgram>
  </DataSet> 如果处理ds 则返回:
<?xml version="1.0" encoding="utf-8" ?> 
  <base64Binary xmlns="http://www.digital-star.com.cn/">H4sIAJXSH4kA/7VYWVMbRxB
……
……
VBuMUDyMAAA==</base64Binary> 处理的方法是这样的      MeoryStream ms=new MemoryStream();
      XmlSerializer ser = new XmlSerializer(typeof(DateSet));
      ser.Serialize(ms,ds);
      return CompressionHelper.Compress(buffer);       CompressionHelper.Compress(byte[] bytesToCompress){//方法内容:
       MeoryStream ms=new MemoryStream();
       Stream s = OUtputStream(ms);
       s.Write(bytesToCompress,0,bytesToCompress.Length);
       s.Close();
       retrun ms.ToArray();
}
问题:
我现在要把
<?xml version="1.0" encoding="utf-8" ?> 
  <base64Binary xmlns="http://www.digital-star.com.cn/">H4sIAJXSH4kA/7VYWVMbRxB
……
……
VBuMUDyMAAA==</base64Binary> 
返回的结果给解出来
webservice 是不变的。我要在java程序上面解返回的xml文件
也就是我怎么处理
H4sIAJXSH4kA/7VYWVMbRxB
……
……
VBuMUDyMAAA==
这个。。
是被压缩了。
我如何的处理解压并且在java 或者J2ME 处理成的是dataset的形式!
注:C# webservice 不变 默认的返回就是
<?xml version="1.0" encoding="utf-8" ?> 
  <base64Binary xmlns="http://www.digital-star.com.cn/">H4sIAJXSH4kA/7VYWVMbRxB
……
……
VBuMUDyMAAA==</base64Binary> 
我要处理这个!
高分给出。希望能够解决

解决方案 »

  1.   

    既然 webservice  是不变的那就直接读喽 卡在哪了  没听懂
      

  2.   

    1. base64的encode decode可以用 commons-codec-1.3.jar(版本无所谓)给你个小例子:String data = XXX;
    byte[] test = org.apache.commons.codec.binary.Base64
    .decodeBase64(data.getBytes());
    2. 至于怎么解析  
    <base64Binary xmlns="http://www.digital-star.com.cn/">H4sIAJXSH4kA/7VYWVMbRxB
    ……
    ……
    VBuMUDyMAAA==</base64Binary>A)如果response的结构比较复杂,且c#有response的xsd schema,你可以用jaxb做unmarshal
    B) 如果仅仅为了读这个base64Binary,可以直接用正则表达式:String pos_regex = "base64Binary>(.+?)<";
    Pattern POS_PATTERN = Pattern.compile(pos_regex);
    Matcher match = POS_PATTERN.matcher(xmlresp);
    if (match.find()) {
    return match.group(1);
    } else {
    return new String("");
    }
      

  3.   

    [code=XML]/<?xml version="1.0" encoding="utf-8" ?> 
      <base64Binary xmlns="http://www.digital-star.com.cn/">H4sIAJXSH4kA/7VYWVMbRxB
    ……
    ……
    VBuMUDyMAAA==</base64Binary>[code] 
    我想把这个转为
    [code=XML]<?xml version="1.0" encoding="utf-8" ?> 
    - <DataSet xmlns="http://www.digital-star.com.cn/">
    - <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:UseCurrentLocale="true">
    - <xs:complexType>
    - <xs:choice minOccurs="0" maxOccurs="unbounded">
    - <xs:element name="Table">
    - <xs:complexType>
    - <xs:sequence>
      <xs:element name="人员编号" type="xs:string" minOccurs="0" /> 
      <xs:element name="中文姓名" type="xs:string" minOccurs="0" />
     <xs:element name="撤销时间" type="xs:string" minOccurs="0" /> 
      <xs:element name="相片" type="xs:string" 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="">
    - <Table diffgr:id="Table1" msdata:rowOrder="0">
      <人员编号>123465345</人员编号> 
      <中文姓名>张良</中文姓名> 
      <英文姓名 /> 
      <别名或绰号 /> 
      <性别>1</性别> 
      <出生日期>2009-01-08T10:10:39+08:00</出生日期> 
    <移交地址省市县区>张家口</移交地址省市县区> 
      <移交地址详细地址>潍坊市</移交地址详细地址> 
      <撤销时间>19520827175518</撤销时间> 
      </Table>
      </NewDataSet>
      </diffgr:diffgram>
      </DataSet>
    [code] 
    在手机端 直接转如何实现
      

  4.   

    <?xml version="1.0" encoding="utf-8" ?> 
      <base64Binary xmlns="http://www.digital-star.com.cn/">H4sIAJXSH4kA/7VYWVMbRxB
    ……
    ……
    VBuMUDyMAAA==</base64Binary> 
    解压 上面的字节
    大侠帮忙啊
      

  5.   

    解决方法:
    先把H4sIAJXSH4kA/7VYWVMbRxB提取出来付给字符串
    把字符串通过base64编码 变成byte[]形式byte[] bt = Base64.decode(String s);
    即可转换在通过Gzip 解压方式进行解压。具体实施代码:
    /***
      * 压缩GZip
      * 
      * @param data
      * @return
      */
     public static byte[] gZip(byte[] data) {
      byte[] b = null;
      try {
       ByteArrayOutputStream bos = new ByteArrayOutputStream();
       GZIPOutputStream gzip = new GZIPOutputStream(bos);
       gzip.write(data);
       gzip.finish();
       gzip.close();
       b = bos.toByteArray();
       bos.close();
      } catch (Exception ex) {
       ex.printStackTrace();
      }
      return b;
     } /***
      * 解压GZip
      * 
      * @param data
      * @return
      */
     public static byte[] unGZip(byte[] data) {
      byte[] b = null;
      try {
       ByteArrayInputStream bis = new ByteArrayInputStream(data);
       GZIPInputStream gzip = new GZIPInputStream(bis);
       byte[] buf = new byte[1024];
       int num = -1;
       ByteArrayOutputStream baos = new ByteArrayOutputStream();
       while ((num = gzip.read(buf, 0, buf.length)) != -1) {
        baos.write(buf, 0, num);
       }
       b = baos.toByteArray();
       baos.flush();
       baos.close();
       gzip.close();
       bis.close();
      } catch (Exception ex) {
       ex.printStackTrace();
      }
      return b;
     }