0

私は、Java for Android(SDK v8)で、XMLを解析し、エントリをListViewに配置するアプリケーションを作成しています。この部分は正常に機能します。XMLをDocumentBuilderで解析しています。これは、エンティティ自体を除いて、エンティティの後に出力する文字列を終了します。私が使用しているエンティティは、標準のエンティティ&(quot、amp、apos、lt、gt);です。また、ソースXMLで数値エンティティを使用しようとしました(たとえば、スペースなしで、出力内容を確認できるようにするため)。これにより、アプリがクラッシュし、logcatが「未終了のエンティティ参照」を報告します。 。

無効なXMLを使用していないことをテストするために、GoogleChromeでXMLを表示してみました。これにより完全に表示されます。エントリblah & blah.txtはに切り捨てられblahます。私が解析しているXMLは以下のとおりです。

編集:はるかに短いXMLサンプル

<?xml version="1.1"?>  
<root>  
<object>  
<id>ROOT</id>  
<type>directory</type>  
<name>../</name>  
</object>  
<object>  
<id>09F010C143B84573A36C50F3EF7E0708</id>  
<type>file</type>  
<name>blah &amp; blah.txt</name>  
</object>   
<object>  
<id>85CF028B838D4E0096C081B987C97045</id>  
<type>file</type>  
<name>Epilist.m3u</name>  
</object>  
</root>  

編集:XML解析クラス編集2:以下は完全なクラスであり、(他の人の助けを借りて)バグがないはずです。誰でもこのクラスを使用できます-私はそれをパブリックドメインコードとして提供しています。このコードを使用するために、私が最初にこのコードを作成したことを参照する必要はありません。これはAndroid向けに設計されていますが、「Log.e」への参照を置き換えることで、私が知る限り、どのJavaプラットフォームでも簡単に使用できます。

package tk.dtechsoftware.mpclient;

import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import android.util.Log;

public class XMLParser {
    public String getXmlFromUrl(String url) {
        String xml = null;

        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);

            // HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // return XML
        return xml;
    }

    public Document getDomElement(String xml) {
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setExpandEntityReferences(false);
        try {

            DocumentBuilder db = dbf.newDocumentBuilder();

            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(xml));
            doc = db.parse(is);

        } catch (ParserConfigurationException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (SAXException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (IOException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        }
        // return DOM
        return doc;
    }

    public String getValue(Element item, String str) {
        NodeList n = item.getElementsByTagName(str);
        return n.item(0).getTextContent(); 
    }

}
4

1 に答える 1

1

要素ノードにそのテキストコンテンツを含む子ノードが1つしかないという保証はないと思います。コンテンツは、複数の子ノードに分割することもできます。

あなたのgetElementValueメソッドはおそらくへの単純な呼び出しで置き換えることができますelem.getTextContent()

于 2012-12-09T23:39:15.227 に答える