2012-02-06 39 views
2

我正在使用黑莓中的xml。 我目前正在使用一个xml字符串,其中一个值是另一个xml字符串。 问题是,当其他值被整齐地提取出来时,xml值不是。 只有“<”正在从节点中提取。从黑莓中的另一个XML字符串中提取嵌入的XML并在黑莓中解码xml

一样,似乎是在正常的java工作。 唯一的区别我可以看到的是在该请求被视为方式:

在Java项目

connection = (HttpURLConnection) url.openConnection(); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Content-Type",   "text/xml;charset=UTF-8"); 
     connection.setRequestProperty("Content-Length", "" +        Integer.toString(resultText.getBytes().length)); 
     connection.setUseCaches(false); 
     connection.setDoInput(true); 
     connection.setDoOutput(true); 

wheras,黑莓用途:

http.setRequestMethod(HttpConnection.POST); 
     http.setRequestProperty("User-Agent","Blackberry 8320/4.2.2  Profile/MIDP-2.0 Configuration/CLDC-1.1"); 

     http.setRequestProperty("x-rim-transcode-content", "none"); 
     http.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); 
     http.setRequestProperty("Content-Length","" + Integer.toString(resultText.getBytes().length)); 

和下面的代码是用于获得Java中的Web服务:: 的响应:

BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
     String line; 
     StringBuffer response = new StringBuffer(); 
     while ((line = rd.readLine()) != null) { 
      response.append(line); 
      response.append('\r'); 
     } 
     rd.close(); 

in BB

InputStream inStream = http.openInputStream(); 
     // Get the length and process the data 
     int len = (int) http.getLength(); 
     if (len > 0) 
     { 
      int actual = 0; 
      int bytesread = 0; 
      byte[] data = new byte[len]; 
      while ((bytesread != len) && (actual != -1)) { 
       actual = inStream.read(data, bytesread, len - bytesread); 
       bytesread += actual; 
      } 
      String recd = new String(data, "UTF-8"); 
      responseData = recd; 

除了这个改变,我看不出有任何其他的不同。嵌入式XML获取一个Java项目完美提取,但BB项目只提取“<” :-(

任何帮助,将不胜感激。

被解析的XML文件是在这里:(没有。提供完整的一个已删除所有,但在嵌入式XML一个值

response:::::<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas .xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.o rg/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://sche mas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:glwsdl"><SOAP-ENV:Body><return xsi:type="SOAP-ENC:Arr ay" SOAP-ENC:arrayType="tns:CrosswordItem[1]"><item xsi:type="tns:CrosswordItem"><Date xsi:type="xsd :string">2012-01-04</Date><Crossword xsi:type="xsd:stri ng">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; 
&lt;crossword size=&quot;7&quot;&gt; 
&lt;grid&gt; 

&lt;cell position=&quot;5_6&quot; value=&quot;&amp;#xAB0;&amp;#xABE;&quot;/&gt; 
&lt;cell position=&quot;6_6&quot; value=&quot;&amp;#xAA8;&quot;/&gt; 
&lt;/grid&gt; 
&lt;horizontalkeys&gt; 
&lt;key number=&quot;19&quot; position=&quot;3_6&quot; length=&quot;4&quot; answer=&quot;&amp;#xA9 C;&amp;#xABE;&amp;#xAAB;&amp;#xAB0;&amp;#xABE;&amp;#xAA8;&quot; question=&quot;&amp;#xA95;&amp;#xAC7 ;&amp;#xAB8;&amp;#xAB0;&quot;/&gt; 
&lt;/horizontalkeys&gt; 
&lt;verticalkeys&gt; 
&lt;key number=&quot;17&quot; position=&quot;6_5&quot; length=&quot;2&quot; answer=&quot;&amp;#xAA E;&amp;#xABE;&amp;#xAA8;&quot; question=&quot;&amp;#xA86;&amp;#xAAC;&amp;#xAB0;&amp;#xAC2;, &amp;#xA AA;&amp;#xACD;&amp;#xAB0;&amp;#xAA4;&amp;#xABF;&amp;#xA B7;&amp;#xACD;&amp;#xAA0;&amp;#xABE;&quot;/&gt; 
&lt;/verticalkeys&gt; 
&lt;/crossword&gt; 
</Crossword><Gridsize xsi:type="xsd:string">7</Gridsize><Id  xsi:type="xsd:string">63</Id></item></re turn></SOAP-ENV:Body></SOAP-ENV:Envelope> 

编辑: 我部分地解决了这个问题:使用 :

xmlEmbeddedData = xmlData.substring(xmlData.indexOf("&lt;?xml  version=&quot;1.0&quot;encoding=&quot;UTF-8&quot;?&gt;"),       xmlData.indexOf("</Crossword>")); 

我设法将我需要的东西提取到另一个字符串中,带有一个问题,我需要解析的xml字符串,现在包含:“& g t; “for”,“& lt;”为<和“& q u o t; &放大器;” ......无空格...

我需要解码的字符串,并返回一个XML字符串,我可以解析 有人可以帮

+0

最后一点:嵌入式XML字符串是CDATA。 – s5v 2012-02-06 10:15:42

回答

1

确定 - 认为我还不如?好回答我的问题:

if (xmlData.indexOf("&lt;?xml version=&quot;1.0&quot; 
    encoding=&quot;UTF-&quot;?&gt;") != -1 && 
    xmlData.indexOf("</Crossword>") != -1) 
{ 
    xmlEmbeddedData = xmlData.substring(
      xmlData.indexOf("&lt;?xml version=&quot;1.0&quot; 
         encoding=&quot;UTF-8&quot;?&gt;"),xmlData.indexOf("</Crossword>")); 
} 

上面我已经通过简单地从两个指标之间的响应数据提取串... 下面我更换了<用适当的值中提取的嵌入XML

System.out.println("embedded--->" + xmlEmbeddedData); 
    xmlEmbeddedData = replace(xmlEmbeddedData, "&lt;", "<", true); 
    xmlEmbeddedData = replace(xmlEmbeddedData, "&gt;", ">", true); 
    xmlEmbeddedData = replace(xmlEmbeddedData, "&amp;", "&", true); 
    xmlEmbeddedData = replace(xmlEmbeddedData, "&quot;", "\"", true); 
    xmlEmbeddedData = replace(xmlEmbeddedData, "\n", "", true); 

这是替换功能:

static public String replace(String val, String fnd, String rpl, 
     boolean igncas) { 
    int fl = (fnd == null ? 0 : fnd.length()); 

    if (fl > 0 && val.length() >= fl) { 
     StringBuffer sb = null; // string buffer 
     int xp = 0; // index of previous fnd 

     for (int xa = 0, mi = (val.length() - fl); xa <= mi; xa++) { 
      if (val.regionMatches(igncas, xa, fnd, 0, fl)) { 
       if (xa > xp) { 
        sb = append(sb, val.substring(xp, xa)); 
       } // substring uses private construct which does not dup 
       // char[] 
       sb = append(sb, rpl); 
       xp = (xa + fl); 
       xa = (xp - 1); // -1 to account for loop xa++; 
      } 
     } 

     if (sb != null) { 
      if (xp < val.length()) { 
       sb.append(val.substring(xp, val.length())); 
      } // substring uses private construct which does not dup char[] 
      return sb.toString(); 
     } 
    } 
    return val; 
}