2010-02-03 45 views
5

Trong đoạn mã XML dưới đây, các không gian tên của a, c, d và e là gì? Tham chiếu đến tài liệu hoặc thông số kỹ thuật sẽ được đánh giá cao.Mặc định không gian tên XML/kế thừa

<a xmlns="http://domain/a"> 
    <pre:b xmlns:pre="http://domain/b"> 
     <c/> 
     <d xmlns=""> 
      <e/> 
     </d> 
    </pre:b> 
</a> 

Ngoài ra, khung công tác Java nào tôn trọng không gian tên chính thức mặc định? Tôi có tride org.w2c. * Gói DOM, tuy nhiên nó dường như không giải quyết đúng URI không gian tên? Ví dụ, một cái gì đó với chức năng tương tự.

String namespace = DocumentParser.parse(). 
        getElement("a"). 
        getElement("b"). 
        getElement("c"). 
        getNamespaceURI(); 

Trả lời

4

Theo hiểu biết tốt nhất của tôi, tất cả các API XML chuẩn trong không gian tên hỗ trợ Java. Nhiều API được viết trước khi các không gian tên được tạo ra (hoặc trở nên phổ biến - tôi không còn nhớ được nữa). Bạn thường cần phải enable support:

public class NS { 
    private static void print(Node node) { 
    Queue<Node> nodes = new LinkedList<Node>(); 
    nodes.add(node); 
    while (!nodes.isEmpty()) { 
     node = nodes.poll(); 
     NodeList list = node.getChildNodes(); 
     for (int i = 0; i < list.getLength(); i++) { 
     nodes.add(list.item(i)); 
     } 
     System.out.format("%s %s %s%n", node.getPrefix(), node.getLocalName(), 
      node.getNamespaceURI()); 
    } 
    } 

    public static void main(String[] args) throws Exception { 
    String xml = "<a xmlns=\"http://domain/a\">" 
     + "<pre:b xmlns:pre=\"http://domain/b\">" + "<c/>" + "<d xmlns=\"\">" 
     + "<e/>" + "</d>" + "</pre:b>" + "</a>"; 

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setNamespaceAware(true); 
    Document doc = dbf.newDocumentBuilder().parse(
     new InputSource(new StringReader(xml))); 
    print(doc.getDocumentElement()); 
    } 
} 

Mã này sẽ in:

null a http://domain/a 
pre b http://domain/b 
null c http://domain/a 
null d null 
null e null 
8

Không gian tên được khai báo sử dụng xmlns="..." trở thành mặc định cho bất kỳ phần tử nào trong đó (cho đến khi mặc định được redeclared trong phần tử sâu hơn). Vì vậy, bạn kết thúc với:

  • A sử dụng http://domain/a (quy định như một mặc định)
  • b sử dụng http://domain/b (quy định, nhưng không phải là một mặc định)
  • c sử dụng http://domain/a (thừa hưởng từ a)
  • d không có không gian tên (quy định như một mặc định mới)
  • e không có không gian tên (thừa hưởng từ d)

Các spec liên quan s ection là tên XML spec, section 6.2:

Phạm vi của một không gian tên mặc định khai kéo dài từ đầu của start-tag trong đó nó xuất hiện đến cuối tương ứng cuối thẻ, trừ phạm vi của bất kỳ tờ khai không gian tên mặc định bên trong nào là . Trong trường hợp thẻ trống, phạm vi là chính thẻ.

Tuyên bố không gian tên mặc định áp dụng cho tất cả các phần tử không được cố định tên trong phạm vi của nó. Các khai báo không gian tên mặc định không áp dụng trực tiếp cho các tên thuộc tính ; việc giải thích của các thuộc tính không được cố định được xác định bởi yếu tố mà chúng xuất hiện.

Nếu có một mặc định khai namespace trong phạm vi, mở rộng tên tương ứng với một tên yếu tố không tiền tố có URI của không gian tên mặc định như tên namespace của nó. Nếu không có không gian tên mặc định khai báo trong phạm vi, không gian tên tên không có giá trị. Tên không gian tên cho tên thuộc tính chưa được cố định luôn không có giá trị. Trong mọi trường hợp, tên địa phương là một phần địa phương (là của khóa học giống với tên không được cố định chính nó).

11

Từ những gì tôi có thể nói nó sẽ như sau.

  • một sẽ http://domain/a như đó là không gian tên mặc định
  • b sẽ http://domain/b như đó là không gian tên được định nghĩa cho b
  • c sẽ http://domain/a như đó là không gian tên mặc định
  • d sẽ một không gian tên trống/không được đặt do thiết lập lại không gian tên
  • e sẽ là không gian tên trống/không được đặt, vì nó được lồng vào bên trong khai báo mới

Tôi đang căn cứ vào số này specification. Dưới đây là một báo giá tóm tắt để giúp đỡ là tốt.

Nếu có một mặc định khai namespace trong phạm vi, mở rộng tên tương ứng với một tên yếu tố không tiền tố có URI của không gian tên mặc định như tên namespace của nó. Nếu không có không gian tên mặc định khai báo trong phạm vi, không gian tên tên không có giá trị. Tên không gian tên cho tên thuộc tính chưa được cố định luôn không có giá trị. Trong mọi trường hợp, tên địa phương là một phần địa phương (là của khóa học giống với tên không được cố định chính nó).

Các vấn đề liên quan