2013-08-22 5 views
0

Есть ли способ получить привязки префикса/пространства имен, используемые в XML-документе, предпочтительно с использованием стандартных API org.w3c.org и javax.xml? Я понимаю, что префиксы могут быть переопределены в содержащихся элементах, поэтому API должен также учитывать это.получить привязки префикса/пространства имен, используемые в XML-документе, предпочтительно используя org.w3c.dom и javax.xml APIs

Я искал фрагмент кода, который бы взял XML-документ в некоторой сериализованной форме и возвратил Map<String, String> префикса для привязок имен URI (плюс некоторые дополнительные умения в API для учета переопределений в закрытых элементах). В идеале библиотека может создавать более интересные вещи, такие как идентификация/очистка неиспользуемых привязок, перемещение дубликатов привязок к их ближайшему общему предку (вместо того, чтобы они были реплицированы повсюду) и так далее.

ответ

1

Вот начало, используя Guava MultiMap:

Document doc = ...; 

Multimap<String, String> bindings = LinkedHashMultimap.create(); 
DocumentTraversal dt = (DocumentTraversal) doc; 
NodeIterator i = dt.createNodeIterator(doc, NodeFilter.SHOW_ELEMENT, 
     null, false); 
Element element = (Element) i.nextNode(); 
while (element != null) { 
    String prefix = element.getPrefix(); 
    if (prefix != null) { 
     String uri = element.getNamespaceURI(); 
     bindings.put(prefix, uri); 
    } 
    element = (Element) i.nextNode(); 
} 

Это будет только забрать привязки, которые действуют, и он не будет связывать любое пространство имен по умолчанию (которые могут быть исправлены, конечно). Повторные определения привязок будут представлены в порядке документа, но не в глубине, где они произошли.

Я предполагаю, что дальнейшая доработка этого метода зависит от вашего прецедента, например. какую еще информацию вы сделали, чтобы сделать что-то разумное в отношении переопределенного привязки?

+0

Фрагмент, однако, создает фактически используемые префиксы («по сути, как вы говорите»), а не те, которые определены, и в моем случае я пытаюсь выкопать префикс, определенный и используемый как значение в атрибуте xsi: type (xsi: type = "a: foo") элемента - и это не возвращается указанным выше кодом. –

+0

Другими словами, как получить префиксы пространств имен, которые определены (в отличие от использования)? –

+0

Предлагаемое решение cis начинается, как я уже сказал. Вы задали еще один вопрос, или я должен добавить к этому? –