4

Blackberry の開発中に問題が発生しました。私は XML 解析に KXML2 API を使用しています (実際には、他の誰かのコードを継続して修正する必要があるため、これを使用する必要があります)。問題は、java me でのクローン作成の欠如であり、ノードをディープ コピーしようとするといくつかの問題が発生します。(詳細には入りたくありませんが、要点は、データを html の特定のポイントに置き換える必要があり、そのための xml 記述子があるということです) そう..! :)

XMLElement childNode = node.getElement(ci);

これは、コピーする必要がある要素です。XMLElement は単純なラッパー クラスですが、それには Element 属性といくつかの便利なメソッドが含まれています。

今私が欲しいのは、次のようなものです:

XMLElement newChildNode = childNode.clone();

Java ME には複製も複製可能なインターフェイスもないため、これを行うことはできません。これは、新しい要素を変更している間、保持する必要がある元の要素への参照を作成するだけです。

XMLElement newChildNode = childNode;

childNode 要素のディープ コピーを作成する方法について、誰もが有用なアイデアを思いつくことができますか? 事前にどうもありがとうございました!

4

1 に答える 1

1

この単純なユーティリティ関数で問題を解決できました。単純に属性を反復処理してコピーし、必要に応じて関数を再帰的に呼び出します。

public static Element createClone(Element toClone) {


            String namespace = (toClone.getNamespace() == null) ? "" : toClone.getNamespace();
            String name = (toClone.getName() == null) ? "" : toClone.getName();

            Element result = toClone.createElement(namespace, name);

            int childCount = toClone.getChildCount();
            int attributeCount = toClone.getAttributeCount();

            for (int i = 0; i < attributeCount; i++) {

                result.setAttribute(toClone.getAttributeNamespace(i), toClone.getAttributeName(i), toClone.getAttributeValue(i));
            }                       

            for (int j = 0; j < childCount; j ++) {

                    Object childObject = toClone.getChild(j);
                    int type = toClone.getType(j);

                    if (type == Node.ELEMENT) {

                            Element child = (Element) childObject;
                            result.addChild(Node.ELEMENT, createClone(child));

                    } else if (type == Node.TEXT) {

                        String childText = new String((String) childObject);

                        if (!childText.equals("")) {
                            result.addChild(Node.TEXT, childObject);
                        }

                    } 
                }


            return result;
        }
于 2012-11-23T12:54:18.083 に答える