2010-02-03 13 views
5

Im folgenden XML-Snippet, was sind die Namespaces von a, c, d und e? Verweis auf Dokumentation oder Spezifikationen würde geschätzt werden.XML-Namespace-Standard/Vererbung

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

Auch welche Java-Frameworks respektieren den offiziellen Namespace-Standard? Ich habe tride org.w2c. * DOM-Pakete, aber es scheint nicht den Namespace-URI korrekt aufzulösen? Zum Beispiel etwas mit ähnlicher Funktionalität zu.

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

Antwort

4

Soweit ich weiß, unterstützen alle gängigen XML-APIs in Java Namespaces. Viele der APIs wurden geschrieben, bevor Namespaces erstellt wurden (oder populär wurden - ich kann mich nicht mehr erinnern). Sie müssen oft 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()); 
    } 
} 

Dieser Code gedruckt wird:

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

Ein Namensraum unter Verwendung erklärte xmlns="..." die Standardeinstellung für alle Elemente innerhalb es wird (bis der Standard dann in einem tieferen Elemente, natürlich neu deklariert ist). So Sie am Ende mit:

  • a verwendet http://domain/a (als Standard festgelegt)
  • b verwendet http://domain/b (angegeben, aber keinen Standard)
  • c verwendet http://domain/a (geerbt von a)
  • d hat keinen Namensraum (als neuen Standard angegeben)
  • e kein Namespace (geerbt von d) hat

Die entsprechende Spezifikation s ection ist die XML-Namen spec, section 6.2:

Der Umfang eines Standard-Namespace Erklärung erstreckt sich vom Beginn des Start-Tag, in dem es bis zum Ende des entsprechenden End-Tag angezeigt wird, mit Ausnahme von der Bereich von inneren Standard-Namespace-Deklarationen. Bei einem leeren Tag ist der Bereich das Tag selbst.

Eine Standard-Namespace-Deklaration gilt für alle Namen ohne Präfix in ihrem Gültigkeitsbereich. Die Standard Namespace-Deklarationen gelten nicht direkt für Attributnamen ; Die Interpretation der nicht vordefinierten Attribute wird durch das Element bestimmt, auf dem sie erscheinen.

Wenn es eine Namensraum-Deklaration in Umfang Default ist, der erweiterte Namen zu ein ohne Präfix Elementnamen entsprechen, haben die URI des Standardnamen als Namensraum Namen. Wenn keine Deklaration des Namensbereichs im Gültigkeitsbereich vorhanden ist, hat der Name des Namensbereichs keinen Wert. Der Name des Namensraums für einen Präfixnamen ohne Präfix hat immer keinen Wert. In allen Fällen ist der lokale Name lokaler Teil (der von Kurs ist natürlich derselbe wie der Name ohne Präfix selbst).

11

Von was ich sagen kann, wäre es wie folgt.

  • a http://domain/a als das sein wird, ist der Standardname
  • b http://domain/b sein wird, wie daß der definierte Namensraum für b
  • ist, wird c http://domain/a sein, wie, dass die Namensraum-Standard ist wird
  • d sein, ein leerer/ungesetzt Namensraum aufgrund Neueinstellung des Namespace
  • e wird ein leerer/ungesetzt Namespace sein, da es in der neuen Erklärung verschachtelt ist

Ich basiere dies von dieser specification. Unten ist ein zusammenfassendes Zitat, um auch zu helfen.

Wenn es eine Namensraum-Deklaration in Umfang Default ist, der erweiterte Namen zu ein ohne Präfix Elementnamen entsprechen, haben die URI des Standardnamen als Namensraum Namen. Wenn keine Deklaration des Namensbereichs im Gültigkeitsbereich vorhanden ist, hat der Name des Namensbereichs keinen Wert. Der Name des Namensraums für einen Präfixnamen ohne Präfix hat immer keinen Wert. In allen Fällen ist der lokale Name lokaler Teil (der von Kurs ist natürlich derselbe wie der Name ohne Präfix selbst).