2010-02-03 21 views
5

W poniższym kodzie XML znajdują się przestrzenie nazw a, c, d i e? Należy docenić odniesienie do dokumentacji lub specyfikacji.Przestrzeń nazw XML domyślnie/dziedziczenie

<a xmlns="http://domain/a"> 
    <pre:b xmlns:pre="http://domain/b"> 
     <c/> 
     <d xmlns=""> 
      <e/> 
     </d> 
    </pre:b> 
</a> 

Ponadto, jakie struktury Java szanują oficjalną przestrzeń nazw? Mam pakiety org.w2c. * DOM, ale wydaje się, że nie poprawnie rozpoznaje identyfikatora URI przestrzeni nazw? Na przykład coś o podobnej funkcjonalności do.

String namespace = DocumentParser.parse(). 
        getElement("a"). 
        getElement("b"). 
        getElement("c"). 
        getNamespaceURI(); 

Odpowiedz

4

Zgodnie z moją wiedzą, wszystkie standardowe interfejsy API XML w Javie obsługują przestrzenie nazw. Wiele interfejsów API zostało napisanych zanim utworzono przestrzenie nazw (lub stały się popularne - nie pamiętam już). Często trzeba enable support:

public class NS { 
    private static void print(Node node) { 
    Queue<Node> nodes = new LinkedList<Node>(); 
    nodes.add(node); 
    while (!nodes.isEmpty()) { 
     node = nodes.poll(); 
     NodeList list = node.getChildNodes(); 
     for (int i = 0; i < list.getLength(); i++) { 
     nodes.add(list.item(i)); 
     } 
     System.out.format("%s %s %s%n", node.getPrefix(), node.getLocalName(), 
      node.getNamespaceURI()); 
    } 
    } 

    public static void main(String[] args) throws Exception { 
    String xml = "<a xmlns=\"http://domain/a\">" 
     + "<pre:b xmlns:pre=\"http://domain/b\">" + "<c/>" + "<d xmlns=\"\">" 
     + "<e/>" + "</d>" + "</pre:b>" + "</a>"; 

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setNamespaceAware(true); 
    Document doc = dbf.newDocumentBuilder().parse(
     new InputSource(new StringReader(xml))); 
    print(doc.getDocumentElement()); 
    } 
} 

Ten kod wypisze:

null a http://domain/a 
pre b http://domain/b 
null c http://domain/a 
null d null 
null e null 
8

Przestrzeń nazw zadeklarowane za pomocą xmlns="..." staje się domyślnym dla wszystkich elementów w nim (aż domyślny jest następnie redeclared w głębszym elementu, oczywiście). Więc skończyć z:

  • zastosowania http://domain/a (określony jako domyślny)
  • b wykorzystuje http://domain/b (wyszczególnione, ale nie jest to ustawienie domyślne)
  • c wykorzystuje http://domain/a (dziedziczone z)
  • d nie ma nazw (określone jako nowych ustawień domyślnych)
  • e nie ma nazw (dziedziczona z klasy D)

Odpowiednia specyfikacja ów ekcja jest spec nazw XML, section 6.2:

Zakres domyślnej przestrzeni nazw deklaracja rozciąga się od początku z uruchomieniem tagu, w którym się pojawia do końca odpowiedniego znacznika końcowego, z wyłączeniem zakres wewnętrznych deklaracji domyślnego obszaru nazw . W przypadku pustego znacznika zakres jest znacznikiem.

Domyślna deklaracja przestrzeni nazw odnosi się do wszystkich nieprefixowanych nazw elementów w zakresie swoich nazw: . Domyślne deklaracje przestrzeni nazw nie mają zastosowania bezpośrednio do nazw atrybutów; interpretacja atrybutów nieprzypisanych jest określona przez element , na którym się pojawiają.

Jeśli jest domyślnym oświadczenie w zakresie nazw , rozszerzony nazwa odpowiadający bez prefiksu nazwy elementu ma URI domyślnej przestrzeni nazw, jak jego nazwa przestrzeni nazw . Jeśli nie ma domyślnej deklaracji obszaru nazw w zakresie, nazwa przestrzeni nazw nie ma wartości. Nazwa przestrzeni nazw dla niepoprawionej nazwy atrybutu zawsze nie ma wartości. We wszystkich przypadkach lokalna nazwa lokalna jest lokalną częścią (która jest z oczywiście taka sama, jak sama niepoprawiona nazwa ).

11

Z tego, co mogę powiedzieć, będzie to następująco.

  • A będzie http://domain/a jak to domyślny nazw
  • B będzie http://domain/b jak to zdefiniowano nazw dla b
  • C będą http://domain/a jak to domyślny nazw
  • R zostaną pusty/nazw wyłączony ze względu na ponowne ustawienie nazw
  • e będzie pusty/nazw unieważnione, ponieważ jest zagnieżdżona wewnątrz nowej deklaracji

Opieram to na tym specification. Poniżej znajduje się podsumowanie oferty, która również pomoże.

Jeśli jest domyślnym oświadczenie w zakresie nazw , rozszerzony nazwa odpowiadający bez prefiksu nazwy elementu ma URI domyślnej przestrzeni nazw, jak jego nazwa przestrzeni nazw . Jeśli nie ma domyślnej deklaracji obszaru nazw w zakresie, nazwa przestrzeni nazw nie ma wartości. Nazwa przestrzeni nazw dla niepoprawionej nazwy atrybutu zawsze nie ma wartości. We wszystkich przypadkach lokalna nazwa lokalna jest lokalną częścią (która jest z oczywiście taka sama, jak sama niepoprawiona nazwa ).

Powiązane problemy