Извлечение встроенного XML из другой строки XML в blackberry и декодирование xml в blackberry - PullRequest
2 голосов
/ 06 февраля 2012

Я работаю с XML в BlackBerry. В настоящее время я работаю со строкой XML, где одним из значений является другая строка XML. проблема в том, что, в то время как другие значения извлекаются аккуратно, значение xml - нет. только "<" извлекается из узла. </p>

то же самое, похоже, работает в обычном 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:

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();

в ВВ

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 извлекает только «<»: - (</p>

любая помощь будет высоко ценится.

анализируемый 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;; a m p;" ... без пробелов ... </p>

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

1 Ответ

1 голос
/ 27 февраля 2012

OK- Я подумал, что могу ответить на свой вопрос:

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, просто извлекая строку из данных ответа между двумя индексами ... ниже я заменил <на соответствующее значение. </p>

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;
}
...