2011-08-23 9 views
26

Quando si utilizza SAX per analizzare un file XML in Java, qual è la differenza tra i parametri localname e qname in metodi SAX come startElement(String uri, String localName,String qName, Attributes attributes)?Qual è la differenza tra localname e qname?

risposta

0

Per impostazione predefinita, un lettore XML segnalerà un URI dello spazio dei nomi e un nome locale per ogni elemento che appartiene a uno spazio dei nomi, nel gestore di inizio e di fine.

consideri il seguente esempio:

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

Con la trasformazione dello spazio dei nomi di default SAX2, il lettore XML sarebbe segnalare un evento di inizio e fine elemento con il Namespace URI http://www.w3.org/1999/xhtml e l'hr localName. La maggior parte delle implementazioni XMLReader riportano anche l'originale qName html: hr, ma tale parametro potrebbe essere semplicemente una stringa vuota (ad eccezione degli elementi che non si trovano in uno spazio dei nomi).

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

+0

Domanda: sarà il QName essere il prefisso + ':' + il nome locale, o sarà '{' + namespace URI + '}' + nome locale? Ad esempio: '{http://www.w3.org/1999/xhtml} hr'. Perché un prefisso lega un elemento a uno spazio dei nomi, ma la sua stringa effettiva non dovrebbe avere importanza. Qualificato = spazio dei nomi e nome locale. –

+1

Sarà 'prefisso +": "+ nome locale'. (Ma puoi scoprirlo guardando nel Javadoc, o nell'output di un parser - perché lo chiedi qui?) –

12

In generale, localName è il nome locale, che significa all'interno del namespace. qname, o nome qualificato, è il nome completo (incluso lo spazio dei nomi). Ad esempio, < a: b ...> avrà un nome locale b, ma un qname a: b.

Questo è tuttavia molto generale e dipende dalle impostazioni. Date un'occhiata all'esempio alla fine di questa pagina per un esempio più completo: example

+0

+1 per il link di esempio. – Kowser

42

Il nome completo include sia il prefisso dello spazio dei nomi che il nome locale: att1 e foo:att2.

XML di esempio

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

del codice Java:

ATT1

attributi senza un prefisso dello spazio dei nomi non si solleva il namespace di default. Ciò significa che mentre lo spazio dei nomi per l'elemento root è "http://www.example.com/DEFAULT", lo spazio dei nomi per l'attributo att1 è "".

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" 
Problemi correlati