Получить весь префикс xml для сопоставлений пространства имен, используя привязки javax xml
Можно ли связать префикс xml → сопоставление пространства имен с картой, используя аннотации javax.xml.bind.*?
Что-то вроде:
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 префикса в соответствующие им пространства имен.
1 ответ
Вы хотите динамически извлекать 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. Это два совершенно разных домена. Если в обоих доменах используются одинаковые префиксы, это совершенно случайно. Не создавайте логику приложения, которая передает префиксы из одного домена в другой, так как это обязательно сломается.