2011-08-23 12 views
26

Al usar SAX para analizar un archivo XML en Java, ¿cuál es la diferencia entre los parámetros nombre local y qname en métodos SAX como startElement(String uri, String localName,String qName, Attributes attributes)?¿Cuál es la diferencia entre localname y qname?

Respuesta

0

De forma predeterminada, un lector XML informará un URI de espacio de nombres y un nombre local para cada elemento que pertenece a un espacio de nombres, tanto en el controlador de inicio como de final.

Consideremos el siguiente ejemplo:

<html:hr xmlns:html="http://www.w3.org/1999/xhtml"/> 

Con el procesamiento de SAX2 espacio de nombres por defecto, el lector XML podría reportar un evento de inicio y final elemento con el URI de espacio y la http://www.w3.org/1999/xhtml hr localName. La mayoría de las implementaciones de XMLReader también informan sobre el nombre original hName html: hr, pero ese parámetro podría ser simplemente una cadena vacía (excepto para los elementos que no están en un espacio de nombres).

http://www.saxproject.org/namespaces.html

+0

Pregunta: ¿el qName sea el prefijo + ':' + el nombre local, o va a ser '{' + URI de espacio + '}' + ¿nombre local? De esta manera: '{http://www.w3.org/1999/xhtml} hr'. Porque un prefijo vincula un elemento a un espacio de nombres, pero su cadena real no debería tener importancia. Calificado = espacio de nombres y nombre local. –

+1

Será 'prefijo +": "+ nombre local'. (Pero puede averiguarlo mirando en el Javadoc, o en el resultado de un analizador sintáctico, ¿por qué pregunta aquí?) –

12

En términos generales, nombre_local es el nombre local, es decir, dentro del espacio de nombres. qname, o nombre calificado, es el nombre completo (incluido el espacio de nombres). Por ejemplo, < a: b ...> tendrá un nombre local b, pero un nombre q a: b.

Sin embargo, esto es muy general y depende de la configuración. Mire el ejemplo al final de esta página para un ejemplo más completo: example

+0

+1 para el enlace del ejemplo. – Kowser

42

El nombre calificado incluye tanto el prefijo del espacio de nombres como el nombre local: att1 y foo:att2.

XML de ejemplo

<root 
    xmlns="http://www.example.com/DEFAULT" 
    att1="Hello" 
    xmlns:foo="http://www.example.com/FOO" 
    foo:att2="World"/> 

Código Java:

ATT1

atributos sin un prefijo de espacio de nombres no recoger el espacio de nombres predeterminado. Esto significa que mientras el espacio de nombre para el elemento root es "http://www.example.com/DEFAULT", el espacio de nombre para el atributo att1 es "".

int att1Index = attributes.getIndex("", "att1"); 
attributes.getLocalName(att1Index); // returns "att1" 
attributes.getQName(att1Index); // returns "att1" 
attributes.getURI(att1Index); // returns "" 

ATT2

int att2Index = attributes.getIndex("http://www.example.com/FOO", "att2"); 
attributes.getLocalName(att2Index); // returns "att2" 
attributes.getQName(att2Index); // returns "foo:att2" 
attributes.getURI(att2Index); // returns "http://www.example.com/FOO" 
Cuestiones relacionadas