Как я загружаю org.w3c.dom. Документ от XML в строке?

Вы можете написать свой собственный слушатель. Это же, что и ответ HelmiB , но выглядит более естественным:

Создать интерфейс прослушивателя:

public interface myAsyncTaskCompletedListener {
    void onMyAsynTaskCompleted(int responseCode, String result);
}

Затем напишите асинхронную задачу:

public class myAsyncTask extends AsyncTask {

    private myAsyncTaskCompletedListener listener;
    private int responseCode = 0;

    public myAsyncTask() {
    }

    public myAsyncTask(myAsyncTaskCompletedListener listener, int responseCode) {
        this.listener = listener;
        this.responseCode = responseCode;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }


    @Override
    protected String doInBackground(String... params) {
        String result;
        String param = (params.length == 0) ? null : params[0];
        if (param != null) {
            // Do some background jobs, like httprequest...
            return result;
        }
        return null;
    }

    @Override
    protected void onPostExecute(String finalResult) {
        super.onPostExecute(finalResult);
        if (!isCancelled()) {
            if (listener != null) {
                listener.onMyAsynTaskCompleted(responseCode, finalResult);
            }
        }
    }
}

Наконец, выполните прослушивание в действии:

public class MainActivity extends AppCompatActivity implements myAsyncTaskCompletedListener {

    @Override
    public void onMyAsynTaskCompleted(int responseCode, String result) {

        switch (responseCode) {
            case TASK_CODE_ONE: 
                // Do something for CODE_ONE
                break;
            case TASK_CODE_TWO:
                // Do something for CODE_TWO
                break;
            default: 
                // Show some error code
        }        
    }

И так вы можете вызвать asyncTask:

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Some other codes...
        new myAsyncTask(this,TASK_CODE_ONE).execute("Data for background job");
        // And some another codes...
}

103
задан Community 23 May 2017 в 12:18
поделиться

3 ответа

Это работает на меня в Java 1.5 - я разделил определенные исключения для удобочитаемости.

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import java.io.ByteArrayInputStream;

public Document loadXMLFromString(String xml) throws Exception
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();

    return builder.parse(new ByteArrayInputStream(xml.getBytes()));
}
79
ответ дан Matt McMinn 24 November 2019 в 04:17
поделиться

Стоп там!

существует потенциально серьезная проблема с этим кодом, потому что это игнорирует кодировку символов, определенную в String (который является UTF-8 по умолчанию). Когда Вы звоните String.getBytes(), кодировка по умолчанию платформы используется для кодирования символов Unicode к байтам. Так, синтаксический анализатор может думать, что это получает данные UTF-8, когда на самом деле это получает EBCDIC или something… не симпатичный!

Вместо этого используйте метод синтаксического анализа, который берет InputSource, который может быть создан с Читателем, как это:

import java.io.StringReader;
import org.xml.sax.InputSource;
…
        return builder.parse(new InputSource(new StringReader(xml)));

Это не может походить на грандиозное предприятие, но незнание проблем кодировки символов приводит к коварной гнили кода, сродни двухтысячному году.

148
ответ дан erickson 24 November 2019 в 04:17
поделиться

Просто имел подобную проблему, кроме мне был нужен NodeList и не Документ, вот то, что я придумал. Это - главным образом то же решение как прежде, увеличенный для снижения корневого элемента как NodeList и предложения erickson's использования использования InputSource вместо этого для проблем кодировки символов.

private String DOC_ROOT="root";
String xml=getXmlString();
Document xmlDoc=loadXMLFrom(xml);
Element template=xmlDoc.getDocumentElement();
NodeList nodes=xmlDoc.getElementsByTagName(DOC_ROOT);

public static Document loadXMLFrom(String xml) throws Exception {
        InputSource is= new InputSource(new StringReader(xml));
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = null;
        builder = factory.newDocumentBuilder();
        Document doc = builder.parse(is);
        return doc;
    }
9
ответ дан shsteimer 24 November 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: