1
String retVal = null;
Document document = DocumentHelper.createDocument();
Element documentRoot = document.addElement(LOAD_EVENT);
Element header = documentRoot.addElement(HEADER);
Element body = documentRoot.addElement(DOCUMENTS);
Namespace namespace =
new Namespace("", "http://www.acme.com/LoadEvent");
documentRoot.add(namespace);

これにより、xmlns がヘッダー ノードとボディ ノードにも追加されます。loadEvent であるルートノードに xmlns のみを追加するにはどうすればよいですか?

4

1 に答える 1

1

はい、これは混乱する可能性があります。ドキュメントが要素およびその他のノード タイプのツリーとして表される場合、各要素は特定の名前空間に属し、他の要素ノードやその祖先からも独立しています。これは、すべての「主要な」XML ノード指向 API (DOM、JDOM、DOM4J、および XOM) に当てはまります。

名前空間に含まれないように LOAD_EVENT 要素を作成しましたが、後でデフォルトの名前空間宣言をノードに追加したため、DOM4J には LOAD_EVENT の名前空間を変更する以外に選択肢がありませんでした (これは、DOM4J が非常に紛らわしいアクションを許可する場所です。 )。ただし、子ノードはまだ名前空間にありません (または空の名前空間)。

後でツリーを XML にシリアル化するとき、ルート ノードで宣言された既定の名前空間は、子ごとに "宣言されていない" 必要があります。

私の推測では、次のようなものが必要です。

    String NS = "http://www.acme.com/LoadEvent";
    Document document = DocumentHelper.createDocument();
    Element documentRoot = document.addElement("load", NS);
    Element header = documentRoot.addElement("header", NS);
    Element body = documentRoot.addElement("documents", NS);

つまり、すべての要素が NS 名前空間に属しています。

つまり、ツリー指向の API では、要素ノードはその親の名前空間を継承しません。各要素は、適切な名前空間がある場合は、それを使用して作成する必要があります。

于 2013-03-15T01:57:33.777 に答える