2012-01-20 13 views
7

tengo el siguiente ejemplo XML:Recuperación de espacios de nombres de elemento en Java (utilizando 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> 

Mi preocupación es con Query elemento. Tiene un atributo de espacio de nombres y, en java, necesitará un namespaceURI para recuperar el valor.

Mi pregunta es: ¿Cómo recuperaría la lista de espacios de nombres del elemento raíz (en este caso, elemento OpenSearchDescription)? Quiero el URI de atributo, prefijo y espacio de nombres que puedo usar para solicitar en Query.

Gracias.

PD: Estoy usando DOM en Java, estándar en Java SE. Estoy dispuesto a pasar a XPath, si es posible. El requisito es que solo se necesite utilizar la API estándar de Java.

Respuesta

14

Esto podría comenzar, factory.setNamespaceAware(true) es la clave para obtener los datos del espacio de nombres después de todo.

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

Gracias, tengo el código similar. Lo importante es comprobar siempre si 'Node.getNamespaceURI()' no es 'null'. Así es como lo compruebo. Funciona. –

0

No sé si es la forma adecuada, pero lo que podría hacer es simplemente tomar los atributos en OpenSearchDescription, averiguar si son declaraciones de espacios de nombres con la ayuda de las constantes ubicadas en javax.xml.XMLConstants, p. XMLNS_ATTRIBUTE constante debe ser "xmlns". Puede atravesar todos los atributos y guardar todos los atributos comenzando con ese valor como su NameSpaceUri.

Creo que también debería echar un vistazo a NameSpaceContext. No sé cómo carga su documento, pero si está usando un XMLStreamReader, puede recuperar un NameSpaceContext que contiene exactamente la información que necesita. Here puede ver dónde puede recuperar el NameSpaceContext de otras maneras.

Espero que ayude.

Cuestiones relacionadas