创建XML的java类可以工作,但在嵌入android应用程序时会出现异常
我在将我编写的java类插入android应用程序时遇到了麻烦。 作为一个独立的java应用程序,它运行良好。 一旦我将这些类放入我的android应用程序中,我在尝试操作xml对象时就会出现异常。 我使用以下方法:创建XML的java类可以工作,但在嵌入android应用程序时会出现异常,java,android,xml,Java,Android,Xml,我在将我编写的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
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
我试着提供尽可能多的信息,希望能有所帮助。从产生的错误中,可以假设
doc.getImplementation
方法从包org.apache.harmony.xml.dom
返回类doImplementImplement
的对象,但您将其强制转换为一个名为doImplementImplement
的类,该类位于包org.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
}
}
在您列出的代码中:
Document doc;
Element root = GetRootElement("root");
Element nameElement;
nameElement = doc.createElement("x");
doc.createElement(“x”)代码>将给出NullPointerException
您以某种方式创建了一个文档,但没有显示它,正是这段代码对解决您的问题最为重要
我认为是这样的:在你的桌面上,你已经编写了使用W3CXML类的代码,然而,当你将它部署到Android上时,Android使用的是Xerces
由于Document
是一个接口,您将获得底层系统提供的任何类型的实现对象,在本例中,它是来自Xerces而不是您的代码所期望的w3c类的实现对象。DomImplementals似乎至少在Android 4.1上不可用(我的设备正在运行该版本,因此我无法确认较新的版本)。该接口存在,但未由您提到的从getImplementation()获取的对象实现
除了演员阵容之外,另一种获得该物品的官方方式如下:
(DOMImplementationLS)doc.getImplementation().getFeature("LS", "3.0");
然而,在Android 4.1上,它返回null
我环顾了一下四周,但不幸的是,我发现解决这个问题的唯一方法是使用转换器以“旧”的方式序列化XML。这在我的设备上确实有效,并且该接口从API级别8(Android 2.2)开始就存在
这是一个较旧的方法,桌面Java也可以使用它。但是,它的行为可能与LSSerializer不同,通常运行速度较慢
(注意:我上面的代码示例显示了如何序列化整个文档,因为这就是我所需要的。如果将单个元素放入DOMSource构造函数中,则可以序列化该元素,否则可能需要创建一个新文档,在其中插入元素,然后序列化该元素……)显然Android使用的是org.w3c.dom,而不是org.w3c.dom。我知道Xerces的XMLSerializerYes应该也能做到这一点。但我不知道将xml文档转换为字符串的其他方法。此外,常规java应用程序不会对此产生任何错误。只有在Android中。因此,我对我的xml文档更感兴趣t、 你是说dominplementals dominplementals=(dominplementals)doc.getImplementation()
在桌面上编译?我不这么认为……除非两者都是相同的类类型是的,这正是我所说的。我最初是作为库编写这个外部类的,但不理解为什么它不工作。然后,当我添加源代码时,我注意到这个错误是因为那一行。我有什么办法转换t他将文档转换为字符串?不管怎样,getImplementation确实返回dominImplementals,这就是API@Bonjo:我不确定您是否完全理解这里的场景。getImplementation
确实返回了DomImpleMeNations。我知道,但当它返回该对象时,您试图用另一个包中的类引用它。它的就像尝试使用整数引用引用字符串对象一样。
Transformer transformer = TransformerFactory.newInstance().newTransformer();
StringWriter stringWriter = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(stringWriter));
String xml = stringWriter.toString();