2011-09-26 41 views
2

我想一个节点复制到不同的Documentg,但它总是抛出:DOMException约如何使用DOM importNode没有抛出:DOMException

org.apache.harmony.xml.dom.NodeImpl.setNameNS(NodeImpl.java:227 )

这里是我的代码

private String getString(Node seqNode) { 
    try {   
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = factory.newDocumentBuilder();   
     Document doc = docBuilder.newDocument(); 

     Element root = doc.createElement("Test"); 
     doc.appendChild(root); 

     /* following line will cause DOMException */ 
     doc.importNode(seqNode, true); 
     ... 
     ... 
     } catch (Exception e) { 

     } 
} 

其中seqNode属于其他文件

没有任何身体有关于这个问题的想法? :-)

+0

我遇到了同样的问题。它只发生在Android,而不是普通的Java 1.6。调用Node.cloneNode()时也会发生这种情况。你有没有找到解决方案? – jfritz42

+0

刚刚发现此链接:看起来像Android中包含的Apache Harmony DOM实现可能是bug:http://code.google.com/p/android/issues/detail?id=2735#c4 – jfritz42

回答

0

我猜测,但似乎你正在尝试导入节点名称空间定义,其中你的目标文件没有这个名称空间声明。

那么,在源文件中声明了哪些名称空间?你是否在目标文件中声明了任何名称空间?

+0

我尝试打印“seqNode .getNamespaceURI()“和”doc.getNamespaceURI()“,它们都是”null“ – Nail

+0

您能告诉我们输入XML吗?以及您尝试复制的节点的XML。 –

+0

对不起,我是新来的人,所以我需要等6小时才能发布我的XML细节。通常会打开,原始文档由Document dom = builder.parse(new ByteArrayInputStream(smil.getBytes()))生成;而“smil”字符串是一个XML文件。我想复制一个节点里面的“身体”标签和所有的孩子生成另一个文件 – Nail

0

输入是以下所示的SMIL字符串:

<smil> 
    <head> 
    <layout> 
     <root-layout height="720" width="1280"/> 
     <transition id="fade" type="fade" subtype="crossfade" dur="1s"/> 
     <region id="_33_32_bkgd_image" left="0" top="0" width="1280" height="720" background-color="#c12121" showBackground="whenActive" z-index="0"></region> 
     <region id="_33_32_I001" left="380" top="27" width="405" height="352" z-index="1"></region><region id="_33_32_I002" left="0" top="365" width="354" height="354" z-index="2"></region> 
    </layout> 
    </head> 
    <body> 
    <seq begin="wallclock(2011-09-22T01:52:00)" end="wallclock(2011-09-23T00:00:00)"> 
     <par dur="10s" xml:id="32" repeatCount="1"> 
     <brush color="#c12121" region="_33_32_bkgd_image"></brush> 
     <seq repeatCount="indefinite"> 
      <img xml:id="30" region="_33_32_I001" src="http://127.0.0.1/Service/User/2_user/Media/Image/30_image.jpg?JFBukihsTu" dur="5s" fit="meet" regPoint="center" regAlign="center">   
       <metadata xml:id="meta-rdf">    
       <meta name="MD5" content="7c8b59b28ea2247f20bc538dcb7108f3"></meta><meta name="width" content="531"></meta><meta name="height" content="720"></meta></metadata></img> 

      <img xml:id="27" region="_33_32_I001" src="http://127.0.0.1/Service/User/2_user/Media/Image/27_image.jpg?jTqCMuIxsX" dur="5s" fit="meet" regPoint="center" regAlign="center">   
      <metadata xml:id="meta-rdf">    
       <meta name="MD5" content="db51409f243f79c566811d1b307a77a1"></meta><meta name="width" content="427"></meta><meta name="height" content="602"></meta></metadata></img> 
     </seq> 
     </par> 
    </seq> 
    </body> 
</smil> 

并且由产生的原始文献:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document dom = builder.parse(new ByteArrayInputStream(smil.getBytes())); 

和seqNode代表 “SEQ” 节点(body标签的子)

我想将“seq”及其所有孩子复制到新文档中

3

i r也是这个问题。调用importNode()或cloneNode()时,我得到这个异常。顺便说一句,我解析/生成的XML没有使用名称空间。

看起来,Android中包含的DOM解析器(来自Apache Harmony)是一个bug。看到这个链接:Issue 2735: Harmony DOM implementation is buggy and noncompliant。如果使用普通Java 1.6(当然不是基于Harmony)执行相同的代码,那么一切正常。

我试着在DocumentBuilder上设置setNamespaceAware(true),但这没有帮助。

最终,我放弃了并且通过使用adoptNode()而不是importNode()来解决这个问题。这有点乱七八糟,因为它从一个文档树中窃取节点并将其放入另一个文档树中。但就我而言,第一个Document树只是暂时的,所以我可以这样做。

相关问题