2

XOMを使用して、Java で XML 文書を作成しています。

単純な XML ドキュメントを作成しましたが、XML 名前空間が必要です。しかし、最初のタグに名前空間を設定すると、子のように空の名前空間が設定されますxmlns=""。どうすればこの動作を取り除くことができますか? xmlns最初のタグのみが必要です。

この XML が必要です。

<request xmlns="http://my-namespace">
    <type>Test</type>
    <data>
        <myData>test data</myData>
    </data>
</request>

しかし、これは XOM から出力された XML 文書です。

<request xmlns="http://my-namespace">
    <type xmlns="">Test</type>
    <data xmlns="">
        <myData>test data</myData>
    </data>
</request>

これは私のJava XOMコードです:

String namespace = "http://my-namespace";
Element request = new Element("request", namespace);

Element type = new Element("type");
type.appendChild("Test");

request.appendChild(type);

Element data = new Element("data");
request.appendChild(data);

Element myData = new Element("myData");
myData.appendChild("test data");
data.appendChild(myData);

Document doc = new Document(request);
doc.toXML();
4

3 に答える 3

8

これは私のために働きます。Elementただし、オブジェクトが親の名前空間を継承しない理由については少し戸惑っています。(XMLやXOMの専門家ではありません)

コード:

String namespace = "http://my-namespace";
Element request = new Element("request", namespace);

Element type = new Element("type", namespace);
type.appendChild("Test");

request.appendChild(type);

Element data = new Element("data", namespace);
request.appendChild(data);

Element myData = new Element("myData", namespace);
myData.appendChild("test data");
data.appendChild(myData);

Document doc = new Document(request);
System.out.println(doc.toXML());

出力:

<?xml version="1.0"?>
<request xmlns="http://my-namespace">
  <type>Test</type>
  <data>
    <myData>test data</myData>
  </data>
</request>
于 2010-07-08T06:49:40.623 に答える
2

私は同じ問題に遭遇しました、そしてグーグルは私をここに導きます。

@Michael-それはjavadocでそれが言っていることです、はい、しかし残念ながら、それはあなたがそれを実装するときそれがどのように機能するかではありません。Catchwaの実装を行わない限り、子要素は引き続き空白のxmlns属性を取得します。

Catchwaの実装は問題なく機能します。名前空間を持つように指示した要素だけが名前空間を持っています。空のxmlns属性はすべてなくなります。おかしいです。

バグですか?私はその部分を理解できないようです。それとも、XOMが機能する方法ですか?

于 2011-07-27T17:31:36.420 に答える
1

名前空間と名前空間宣言を混同しないでください。名前空間は、各要素の固有のプロパティです。名前空間宣言は「xmlns」属性です。それらは接続されていますが、同じものではありません。要素を作成するときは、名前空間の宣言ではなく、名前空間を設定します。

XOM データ モデルでは、名前空間は属性ではありません。それらは要素自体の固有のプロパティです。要素の子が親と同じ名前空間にある必要がある XML の規則はありません。実際、理論的には、ドキュメント内のすべての要素が異なる名前空間にある可能性があります。

XOM では、要素または属性の名前空間を指定すると同時に、ローカル名を指定します。要素を作成するとき、要素には最初は親がないため、XOM がその要素に親と同じ名前空間をデフォルトで与える方法はありません。

xmlnsドキュメントがシリアル化されると、名前空間はおよびxmlns:*prefix*属性で表されます。XOM は、各要素に割り当てられた名前空間に一致するように、これらの要素を配置する場所を見つけ出します。コード内の各要素に必要な名前空間を指定するだけで、名前空間宣言を配置する場所を XOM に判断させます。

于 2016-03-25T13:41:01.970 に答える