2012-01-20 14 views
7

Ho il seguente esempio XML:Recupero Namespace Element in Java (usando DOM)

<?xml version="1.0" encoding="UTF-8"?> 
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" 
    xmlns:custom="http://example.com/opensearchextensions/1.0/"> 
    <ShortName>Test</ShortName> 
    <Description>Testing....</Description> 
    <Url template="whatever" type="what" /> 
    <Query custom:color="blue" role="example" /> 
</OpenSearchDescription> 

La mia preoccupazione è con Query elemento. Ha un attributo Namespace e, in java, è necessario un namespaceURI per recuperare il valore.

La mia domanda è: come posso recuperare l'elenco di spazi dei nomi dall'elemento radice (in questo caso, elemento OpenSearchDescription)? Voglio l'URI di attributo, prefisso e spazio dei nomi che posso usare per richiedere su Query.

Grazie.

PS: sto usando DOM in java, standard in Java SE. Sono disposto a passare a XPath, se è possibile. Il requisito è che sia necessario utilizzare solo l'API standard Java.

risposta

14

Questo potrebbe iniziare, factory.setNamespaceAware(true) è la chiave per ottenere i dati del namespace dopo tutto.

public static void main(String[] args) throws ParserConfigurationException, SAXException, 
     IOException 
{ 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document doc = builder.parse(new File(args[0])); 
    Element root = doc.getDocumentElement(); 
    //prints root name space 
    printAttributesInfo((Node) root); 

    NodeList childNodes = root.getChildNodes(); 
    for (int i = 0; i < childNodes.getLength(); i++) 
    { 
     printAttributesInfo(childNodes.item(i)); 
    } 
} 

public static void printAttributesInfo(Node root) 
{ 
    NamedNodeMap attributes = root.getAttributes(); 
    if (attributes != null) 
    { 
     for (int i = 0; i < attributes.getLength(); i++) 
     { 
      Node node = attributes.item(i); 
      if (node.getNodeType() == Node.ATTRIBUTE_NODE) 
      { 
       String name = node.getNodeName(); 
       System.out.println(name + " " + node.getNamespaceURI()); 
      } 
     } 
    } 
} 
+1

Grazie, ho il codice simile. Il problema è controllare sempre se restituisce 'Node.getNamespaceURI()' non è 'null'. È così che controllo. Funziona. –

0

Non so se è il modo appropriato ma quello che potresti fare è semplicemente prendere gli attributi su OpenSearchDescription, scoprire se sono dichiarazioni di namespace con l'aiuto delle costanti situate in javax.xml.XMLConstants, ad es. La costante XMLNS_ATTRIBUTE dovrebbe essere "xmlns". È possibile attraversare tutti gli attributi e salvare tutti gli attributi che iniziano con quel valore come NameSpaceUri.

Penso che dovresti dare un'occhiata anche allo NameSpaceContext. Non so come si carica il documento, ma se si utilizza uno XMLStreamReader, è possibile recuperare uno NameSpaceContext da esso che contiene esattamente le informazioni necessarie. Here puoi vedere dove puoi recuperare lo NameSpaceContext in altri modi.

Spero che questo aiuti.