Извлечение встроенного XML из другой строки XML в Blackberry и декодирование XML в Blackberry

Я работаю с xml в Blackberry. В настоящее время я работаю со строкой 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);

В ежевике используются:

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:

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>, "& l t;" для ‹и" & q u o t; & a m p; "... без пробелов ...

Мне нужно декодировать строку и вернуть строку xml, которую я могу проанализировать. может кто-нибудь помочь?


person s5v    schedule 06.02.2012    source источник
comment
последний пункт: встроенная строка xml находится в CDATA.   -  person s5v    schedule 06.02.2012


Ответы (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;
}
person s5v    schedule 27.02.2012