Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建XML的java类可以工作,但在嵌入android应用程序时会出现异常_Java_Android_Xml - Fatal编程技术网

创建XML的java类可以工作,但在嵌入android应用程序时会出现异常

创建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

我在将我编写的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

我试着提供尽可能多的信息,希望能有所帮助。

从产生的错误中,可以假设
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();