2

javax.xml.bind.* 注釈を使用して、xml プレフィックス→名前空間マッピングをマップにバインドすることは可能ですか?

何かのようなもの:

class FooPOJO {
...
  @Namespacebindingannotation
  Map<String,String> prefixToNamespaceMap;
...
}

そしてxmlで

<foo
  xmlns="http://foo.com"
  xmlns:bar="http://bar.com"
  xmlns:baz="http://baz.com">
...

xml をアンマーシャリングするprefixToNamespaceMapと、3 つのプレフィックスが適切な名前空間にマップされます。

4

1 に答える 1

0

名前空間 URI とプレフィックスを XML から動的に抽出しますか? それは本当に悪い考えです。

XML 名前空間は、アプリケーション コードとそれが処理する XML の間の契約の一部です。アプリケーションにハードコードする必要があります。

理由は簡単です。これらの XML は異なって見えますが、すべて同じドキュメントです。

<foo:root xmlns:foo="http://main/ns" xmlns:bar="http://secondary/ns">
  <foo:child bar:attr="1234">some data</foo:child>
</foo:root>

また

<bar:root xmlns:bar="http://main/ns" xmlns:foo="http://secondary/ns">
  <bar:child foo:attr="1234">some data</bar:child>
</bar:root>

また

<root xmlns="http://main/ns" xmlns:baz="http://secondary/ns">
  <child baz:attr="1234">some data</child>
</root>

したがって、それらから名前空間を動的に抽出すると、後続のコードは必然的に (そして不必要に) 壊れます。

コードで実際の名前空間 URI を使用し、好みに合わせてプレフィックスを選択します。プレフィックスは一時的なものであり、XML ファイルと一致する必要はありません。XML は厳密に型指定されたデータであるため、それに応じて処理してください。

つまり、名前空間プレフィックスはエイリアスであり、便利な機能であり、シリアル化されたデータにのみ存在します。それらは XML に存在し、DOM には存在しません。それらはアプリケーションの XPath 式に存在し、XPath 式が解析される抽象ツリーには存在しません。これらは 2 つの完全に別個のドメインです。両方のドメインで同じプレフィックスが使用されている場合、それはまったくの偶然です。1 つのドメインから別のドメインにプレフィックスを転送するアプリケーション ロジックを構築しないでください。

于 2015-01-05T07:52:30.207 に答える