2011-09-26 43 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樹只是暫時的,所以我可以這樣做。

相關問題