2011-08-23 50 views
26

Khi sử dụng SAX để phân tích cú pháp tệp XML trong Java, sự khác nhau giữa các tham số tên địa phươngqname trong các phương thức SAX như startElement(String uri, String localName,String qName, Attributes attributes)?Sự khác biệt giữa localname và qname là gì?

Trả lời

0

Theo mặc định, trình đọc XML sẽ báo cáo URI không gian tên và tên cục bộ cho mỗi phần tử nằm trong vùng tên, trong cả trình xử lý bắt đầu và kết thúc.

Hãy xem xét ví dụ sau:

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

Với việc xử lý Namespace sax2 mặc định, người đọc XML sẽ báo cáo một sự kiện bắt đầu và kết thúc phần tử với các không gian tên URI http://www.w3.org/1999/xhtml và hr localName. Hầu hết các triển khai XMLReader cũng báo cáo qName html ban đầu: hr, nhưng tham số đó có thể chỉ đơn giản là một chuỗi rỗng (ngoại trừ các phần tử không nằm trong không gian tên).

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

+0

Hỏi: QName sẽ là tiền tố + ':' + tên địa phương, hoặc nó sẽ là '{' + namespace URI + '}' + tên địa phương? Giống như vậy: '{http://www.w3.org/1999/xhtml} hr'. Bởi vì một tiền tố liên kết một phần tử với một không gian tên, nhưng chuỗi thực tế của nó không quan trọng. Đủ điều kiện = không gian tên và tên địa phương. –

+1

Nó sẽ là 'tiền tố +": "+ tên địa phương". (Nhưng bạn có thể thấy điều đó bằng cách nhìn vào Javadoc, hoặc trong đầu ra của trình phân tích cú pháp - tại sao bạn hỏi ở đây?) –

12

Nói chung, tên địa phương là tên địa phương, có nghĩa là bên trong không gian tên. qname, hoặc tên đủ điều kiện, là tên đầy đủ (bao gồm cả không gian tên). Ví dụ: < a: b…> sẽ có tên địa phương b, nhưng a aname a: b.

Điều này tuy nhiên rất chung chung và phụ thuộc vào cài đặt. Hãy xem ví dụ ở cuối trang này để có ví dụ hoàn chỉnh hơn: example

+0

+1 cho liên kết ví dụ. – Kowser

42

Tên đủ điều kiện bao gồm cả tiền tố không gian tên và tên địa phương: att1foo:att2.

mẫu XML

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

Mã Java:

att1

Thuộc tính mà không có một tiền tố namespace không nhận không gian tên mặc định. Điều này có nghĩa là khi không gian tên cho phần tử root"http://www.example.com/DEFAULT", không gian tên cho thuộc tính 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" 
Các vấn đề liên quan