2014-01-04 3 views
1

Я хочу прочитать все пространства имен в документе DOM.Чтение всех пространств имен в документе DOM

Мой входной файл XML является:

<a:Sample xmlns:a="http://a.org/" 
    xmlns:b="http://b.org/"> 
    <a:Element b:Attribute="text"> </a:Element> 
</a:Sample> 

Я хочу, чтобы получить все префиксы со своими ассоциированными пространствами имен в данном входном XML.

У меня есть метод со следующим определением.

public Document check(Document srcfile) { 
    Document naReport = null; 

    if(srcfile != null) { 
     // Parse the document using builder. 
     if (srcfile instanceof DocumentTraversal) { 
      DocumentTraversal dt = (DocumentTraversal) srcfile; 
      NodeIterator i = dt.createNodeIterator(srcfile, NodeFilter.SHOW_ELEMENT, null, false); 
      System.out.println(srcfile.getPrefix()); 
      System.out.println(srcfile.getNamespaceURI()); 
      Element element = (Element) i.nextNode(); 
      while (element != null) { 
       String prefix = element.getPrefix(); 
       if (prefix != null) { 
        String uri = element.getNamespaceURI(); 
        System.out.println("Prefix: " + prefix); 
        System.out.println("URI: " + uri); 
        // bindings.put(prefix, uri); 
       } 
       element = (Element) i.nextNode(); 
      } 
     } 
    } 

    return naReport; 
} 

Но, когда я запускаю свою программу, я получаю следующий результат:

Prefix: a 
URI: http://a.org/ 
Prefix: a 
URI: http://a.org/ 

Может кто-нибудь мне помочь.

+0

Вы смотрите только в пространстве имен элемента. Пространство имен b используется только для атрибутов элемента. Вам также придется изучить все атрибуты и собрать из них пространства имен. –

+0

Я изменил итератор узла, чтобы иметь как элементы, так и атрибуты следующим образом: \t NodeIterator i = dt.createNodeIterator (srcfile, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_ATTRIBUTE, null, false); Даже тогда я получаю тот же результат. –

+0

Это не сработает. SHOW_ATTRIBUTE не очень полезно. См. Комментарий в Javadoc для createNodeIterator. «Поскольку атрибуты никогда не являются дочерними узлами других узлов, они не отображаются при перемещении по дереву документов». Вам придется циклически перебирать атрибуты для каждого элемента отдельно для каждого элемента. –

ответ

0

Вы должны перебрать атрибуты каждого элемента внутри основного контура элемента:

NamedNodeMap map = element.getAttributes(); 
for (int iattr=0; iattr<map.getLength(); iattr++) { 
    Attr attr = (Attr)map.item(iattr); 
    if (attr.getNamespaceURI() != null) { 
     System.out.println("Attr " + attr.getName() + " - " + attr.getNamespaceURI()); 
    } 
} 
+0

Thats работает отлично. Спасибо, Стив. –

+0

Есть еще одна проблема, с которой я борюсь. Я хочу, чтобы карта области и списка объектов пространства имен (объект пространства имен будет иметь как префикс, так и URL-адрес пространства имен). Можно ли это получить? –

Смежные вопросы