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。

作为Document接口,您将获得底层系统提供的任何类型的实现对象,在本例中,它是来自 Xerces 的CoreDocumentImpl,而不是您的代码期望的 w3c 类。

于 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 回答