ノードを新しいドキュメントにインポートする

ベース文書から新しい文書にノードをインポートしようとしていますが、Document.importNode()メソッドを使用すると、例外が生成されます。面白いことに、この例外にはメッセージが含まれていないので、スタックトレース以外はかなり盲目です。 (私はJavaに新しいです)

新しい文書を作成してノードをインポートする方法は次のとおりです。

  • this.Builder = DocumentBuilder
  • this.Element = Node

コード:

public XMLSelection extract ()
{
    if (this.Element != null)
    {
        try
        {
            Document newDoc = this.Builder.newDocument();
            Node node = newDoc.importNode(this.Element, true);

            newDoc.appendChild(node);
            return new XMLSelection(newDoc);
        }
        catch(Exception e)
        {
            Debug.error("XMLSelection::extract", e);
        }
    }
    return null;
}

そしてスタックトレース:

02-06 14:27:53.328: W/System.err(9082): org.w3c.dom.DOMException
02-06 14:27:53.328: W/System.err(9082):     at org.apache.harmony.xml.dom.NodeImpl.setNameNS(NodeImpl.java:227)
02-06 14:27:53.328: W/System.err(9082):     at org.apache.harmony.xml.dom.ElementImpl.(ElementImpl.java:50)
02-06 14:27:53.328: W/System.err(9082):     at org.apache.harmony.xml.dom.DocumentImpl.createElementNS(DocumentImpl.java:336)
02-06 14:27:53.328: W/System.err(9082):     at org.apache.harmony.xml.dom.DocumentImpl.shallowCopy(DocumentImpl.java:156)
02-06 14:27:53.328: W/System.err(9082):     at org.apache.harmony.xml.dom.DocumentImpl.cloneOrImportNode(DocumentImpl.java:208)
02-06 14:27:53.328: W/System.err(9082):     at org.apache.harmony.xml.dom.DocumentImpl.importNode(DocumentImpl.java:222)
02-06 14:27:53.328: W/System.err(9082):     at com.xxxx.xxxx.XMLSelection.extract(XMLSelection.java:57)
6
私は<body>タグに基づいて新しい文書を作成しようとしています。ここにxmlがあります:リンク
追加された 著者 Daniel,
DOMExceptionは、要素(または子要素)に修飾名がないためにスローされます。このエラーの原因となるXMLをダンプできますか?
追加された 著者 Jens,

1 答え

子要素を新しい Document のルート要素として使用するには、 cloneNode adoptNode を試してください。

    String xml = "";
    try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();

        Document document0 = db.parse(new InputSource(new StringReader(xml)));
        Document document1 = db.newDocument();


        NodeList nodeList = document0.getDocumentElement().getChildNodes();
        document1.appendChild(document1.adoptNode(nodeList.item(0).cloneNode(true)));

       //Serialize the two documents to check that the copy was correct.
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(document0), new StreamResult(output));
        System.out.println(output.toString("UTF-8"));

        output.reset();
        transformer.transform(new DOMSource(document1), new StreamResult(output));
        System.out.println(output.toString("UTF-8"));
    } catch (TransformerException e) {
    } catch (IOException e) {
    } catch (SAXException e) {
    } catch (ParserConfigurationException e) {
    }
13
追加された
eclipseを使用する場合、Document.adoptNode()は未定義です。 (import org.w3c.dom.Document;)。私が使用すべき別のパッケージがありますか?
追加された 著者 Daniel,
SDK 7(Android 2.1) SDKをアップするか、回避策はありますか?
追加された 著者 Daniel,
さて、ありがとう。私はAPIレベル8を目指します。
追加された 著者 Daniel,
簡単な質問ですが、新しい文書は工場の「本当の」文書ではありませんか? APIを8に設定しましたが、adoptNodeメソッドが定義されましたが、同じエラーが発生します。私の最高の推測はあなたの例の "document01"は有効ではない、私のアプローチでもないということですか?私の意図は、このドキュメントを出力するのではなく、NodeListに基づいて新しいオブジェクト(XMLSelection)を作成することです。新しいドキュメントを作成する私のアプローチが最適化されていない可能性があります。私はまだ選択(ノード)を使用してgetElementsByTagNameメソッドにアクセスしたいです。
追加された 著者 Daniel,
OK、両方の試行でcloneNodeメソッドを使用しましたが、いくつかのテストの後に、これは何かを壊すようです。 cloneNodeを削除すると、それが解決されました。すべての助けをありがとう!
追加された 著者 Daniel,
あなたはAndroidのどのバージョンをターゲットにしていますか?私が完全に間違って覚えていない場合、adoptNodeはAPIレベル8です。
追加された 著者 Jens,
APIレベル8のXMLは非常に厄介で、2.1ではむしろ小市場シェア - 私はそれを上げますが、それはあなたの要求に依存します。
追加された 著者 Jens,
appendChild(adoptNode(cloneNode)))を使用していてもデバイス上でクラッシュしますか?私はpastebinでアップロードしたXMLでテストしました。この例の document1 は、 "完全に正常な" ドキュメントとして機能します。変更されたアプローチで質問にスタックトレースを添付できますか?
追加された 著者 Jens,
btw:元のドキュメントに頼らずにノードを複製する必要がないので、その場合は心配はありません。
追加された 著者 Jens,