2011-08-23 51 views
26

當使用SAX解析Java中的XML文件時,參數本地名稱qname在SAX方法(如startElement(String uri, String localName,String qName, Attributes attributes))中有什麼區別?localname和qname有什麼區別?

回答

0

默認情況下,XML讀取器將在開始和結束處理程序中報告名稱空間中屬於每個元素的名稱空間URI和localName。

考慮下面的例子:

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

在缺省SAX2名稱空間處理,XML讀取器將報告與所述命名空間URI http://www.w3.org/1999/xhtml和的localName hr的開始和結束元素事件。大多數XMLReader實現也報告原始的qName html:hr,但該參數可能只是一個空字符串(除了不在名稱空間中的元素)。

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

+0

問題:將QNAME是前綴+ ':' +本地名稱,或會是 '{' +命名空間URI + '}' +本地名稱?像這樣:'{http://www.w3.org/1999/xhtml} hr'。因爲前綴將元素綁定到名稱空間,但其實際字符串應該沒有任何重要性。 Qualified =名稱空間和本地名稱。 –

+1

它將是'prefix +「:」+ localname'。 (但是,通過查看Javadoc或解析器的輸出,您可以發現這一點 - 爲什麼要問這裏?) –

12

一般來說,localName創建的本地名稱,命名空間裏面的意思。 qname或限定名稱是全名(包括名稱空間)。例如,< a:b ...>將有一個localname b,但是一個qname a:b。

然而,這是非常普遍的,並取決於設置。請參閱本頁末尾的示例以獲得更詳盡的示例:example

+0

+1爲例子的鏈接。 – Kowser

42

限定名稱包含名稱空間前綴和本地名稱:att1foo:att2

示例XML

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

Java代碼:

ATT1

屬性沒有命名空間前綴不拿起默認的命名空間。這意味着雖然root元素的名稱空間爲"http://www.example.com/DEFAULT",但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"