3

作成した Java クラスを Android アプリケーションに挿入するのに問題があります。スタンドアロンの Java アプリケーションとして、問題なく動作します。クラスを取得してAndroidアプリ内に配置すると、xmlオブジェクトを操作しようとすると例外が発生します。私は以下を使用します:

import org.w3c.dom.Element;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSSerializer;

私がしていることは基本的にこれです:

Document doc;
Element root = GetRootElement("root");
Element nameElement;
nameElement = doc.createElement("x");
nameElement.setTextContent("y");
root.appendChild(nameElement);

DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation();
LSSerializer lsSerializer = domImplementation.createLSSerializer();
return lsSerializer.writeToString(doc); //sends the xml's string somewhere else in the code

現在、このコードを通常の Java アプリケーションとして実行すると機能しますが、Android アプリでdoc.getImplementation()は次のエラーで失敗します。

Caused by: java.lang.ClassCastException: org.apache.harmony.xml.dom.DOMImplementationImpl cannot be cast to org.w3c.dom.ls.DOMImplementationLS

できるだけ多くの情報を提供しようとしましたが、お役に立てば幸いです。

4

3 に答える 3

2

DOMImplementationLS は、少なくとも Android 4.1 では利用できないようです (私のデバイスはそのバージョンを実行しているため、新しいバージョンについては確認できません)。インターフェイスは存在しますが、getImplementation() から取得したオブジェクトによって実装されていません。

キャストとは別に、このオブジェクトを取得する別の公式の方法は次のとおりです。

(DOMImplementationLS)doc.getImplementation().getFeature("LS", "3.0");

ただし、これは Android 4.1 では null を返します。

いろいろ調べてみましたが、残念ながら、この問題を解決する唯一の方法は、Transformer を使用して「古い」方法で XML をシリアル化することです。これは私のデバイスで動作し、インターフェイスは API レベル 8 (Android 2.2) 以降で存在します。

Transformer transformer = TransformerFactory.newInstance().newTransformer();
StringWriter stringWriter = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(stringWriter));
String xml = stringWriter.toString();

これは古い方法であり、デスクトップ Java にも使用できます。ただし、LSSerializer とは異なる動作をする可能性があり、通常は動作が遅くなります。

(注: 上記のコード例は、ドキュメント全体をシリアル化する方法を示しています。必要なのはそれだけです。単一の要素を DOMSource コンストラクターに入れればシリアル化できますが、それ以外の場合は、新しいドキュメントを作成して、その中の要素、そしてそれをシリアル化します...)

于 2014-02-15T17:54:02.037 に答える
0

あなたがリストしたコードで:

Document doc;
Element root = GetRootElement("root");
Element nameElement;
nameElement = doc.createElement("x");

doc.createElement("x");NullPointerException が発生します。

何らかの方法でドキュメントを作成しましたが、それを表示しません。問題を解決するために最も重要なのは、そのコードのビットです。

デスクトップでは、w3c xml クラスを使用するコードを記述しましたが、それを Android にデプロイすると、Android は Xerces を使用しています。

interfaceと同様Documentに、基になるシステムが提供する任意の型の実装 Object を取得します。この場合、これは、コードが期待する w3c クラスではなく、Xerces からの CoreDocumentImpl です

于 2013-10-11T12:58:56.780 に答える
-1

生成されたエラーから、メソッドがパッケージからdoc.getImplementationクラスのオブジェクトを返すと仮定できますが、パッケージ内にあるという名前のクラスにキャストしていますDOMImplementationImplorg.apache.harmony.xml.domDOMImplementationImplorg.w3c.dom.ls

こんな感じです、

package sample1;
public class SampleClass {
}

package sample2;
public class SampleClass{
}

package sample3;
import sample2.SampleClass
public class ReturningClass{
  public Object returnSampleClass() {
    return new SampleClass(); // returns the object from package sample2
  }
}

package test;

import sample1.SampleClass; //importing class from sample1
import sample3.ReturningClass;

public class Test {

public static void main(String[] args) {
  ReturningClass returner = new ReturningClass();
  SampleClass s =  (SampleClass)returner.returnSampleClass(); 
  //conflict arises as incompatible class types
}

}
于 2013-10-11T12:08:08.403 に答える