如何在没有DOMException的情况下使用DOM importNode

时间:2011-09-26 06:58:48

标签: java android xml

我想将一个节点复制到另一个Documentg,但它总是有关于

的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属于其他文档

有没有人知道这个问题? : - )

3 个答案:

答案 0 :(得分:3)

我也遇到了这个问题。调用importNode()或cloneNode()时,我收到此异常。而BTW,我正在解析/生成的XML没有使用命名空间。

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

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

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

答案 1 :(得分:0)

我猜,但似乎您正在尝试导入已定义命名空间的节点,其中您的目标文档没有声明此命名空间。

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

答案 2 :(得分: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”及其所有孩子复制到新文档