Cách chính xác để biểu diễn các phần tử XML null là gì?


166

Tôi đã thấy nullcác yếu tố được thể hiện theo nhiều cách:

Phần tử có mặt với xsi:nil="true":

 <book>
     <title>Beowulf</title>
     <author xsi:nil="true"/>
 </book>

Phần tử có mặt, nhưng được biểu diễn dưới dạng phần tử trống (mà tôi tin là sai vì 'trống' và nullkhác nhau về mặt ngữ nghĩa):

 <book>
     <title>Beowulf</title>
     <author/>
 </book>

 <!-- or: -->
 <book>
     <title>Beowulf</title>
     <author></author>
 </book>

Phần tử hoàn toàn không có trong đánh dấu trả về :

 <book>
     <title>Beowulf</title>
 </book>

Phần tử có một <null/>phần tử con (từ TStamper bên dưới):

 <book>
     <title>Beowulf</title>
     <author><null/></author>
 </book>

Có một cách chính xác, hoặc kinh điển để đại diện cho một nullgiá trị như vậy ? Có những cách bổ sung hơn các ví dụ trên?

XML cho các ví dụ ở trên là có sẵn, vì vậy đừng đọc quá xa về nó. :)

Câu trả lời:


121

xsi: nil là cách chính xác để biểu thị một giá trị sao cho: Khi lệnh gọi Cấp 2 của DOM getEuityValue () được phát hành, giá trị NULL được trả về. xsi: nil cũng được sử dụng để chỉ ra một phần tử hợp lệ không có nội dung ngay cả khi loại phần tử đó thường không cho phép các phần tử trống.

Nếu một thẻ trống được sử dụng, getEuityValue () trả về chuỗi trống ("") Nếu thẻ bị bỏ qua, thì không có thẻ tác giả nào xuất hiện. Điều này có thể khác về mặt ngữ nghĩa so với việc đặt nó thành 'nil' (Ví dụ: Đặt "Sê-ri" thành nil có thể là cuốn sách không thuộc về sê-ri, trong khi bỏ qua loạt có thể có nghĩa là sê-ri là yếu tố không thể áp dụng cho yếu tố hiện tại.)

Từ: W3C

Lược đồ XML: Các cấu trúc giới thiệu một cơ chế để báo hiệu rằng một phần tử phải được chấp nhận là · hợp lệ · khi nó không có nội dung mặc dù loại nội dung không yêu cầu hoặc thậm chí không nhất thiết phải cho phép nội dung trống. Một phần tử có thể · hợp lệ · không có nội dung nếu nó có thuộc tính xsi: nil với giá trị true. Một phần tử được gắn nhãn phải trống, nhưng có thể mang các thuộc tính nếu được cho phép bởi loại phức tạp tương ứng.

Làm rõ:
Nếu bạn có một phần tử xml sách và một trong các phần tử con là sách: sê-ri bạn có một số tùy chọn khi điền nó:

  1. Xóa hoàn toàn thành phần - Điều này có thể được thực hiện khi bạn muốn chỉ ra rằng bộ đó không áp dụng cho cuốn sách này hoặc cuốn sách đó không phải là một phần của bộ. Trong trường hợp này, các biến đổi xsl (hoặc các bộ xử lý dựa trên sự kiện khác) có mẫu phù hợp với sách: sê-ri sẽ không bao giờ được gọi. Ví dụ: nếu xsl của bạn biến thành phần sách thành hàng bảng (xhtml: tr), bạn có thể nhận được số lượng ô bảng không chính xác (xhtml: td) bằng phương pháp này.
  2. Để trống phần tử - Điều này có thể chỉ ra rằng sê-ri là "" hoặc không xác định hoặc sách không phải là một phần của sê-ri. Bất kỳ biến đổi xsl nào (hoặc trình phân tích cú pháp dựa trên evernt khác) phù hợp với sách: sê-ri sẽ được gọi. Giá trị của current () sẽ là "". Bạn sẽ nhận được cùng số thẻ xhtml: td bằng phương pháp này như với mô tả tiếp theo.
  3. Sử dụng xsi: nil = "true" - Điều này biểu thị rằng phần tử book: series là NULL, không chỉ trống. Biến đổi xsl của bạn (hoặc trình phân tích cú pháp dựa trên sự kiện khác) có sách phù hợp với mẫu: sê-ri sẽ được gọi. Giá trị của current () sẽ trống (không phải chuỗi rỗng). Sự khác biệt chính giữa phương thức này và (2) là loại lược đồ của cuốn sách: sê-ri không cần cho phép chuỗi rỗng ("") làm giá trị hợp lệ. Điều này không có ý nghĩa thực sự đối với một phần tử chuỗi, nhưng đối với một phần tử ngôn ngữ được xác định là một kiểu liệt kê trong lược đồ, xsi: nil = "true" cho phép phần tử không có dữ liệu. Một ví dụ khác sẽ là các phần tử của kiểu thập phân. Nếu bạn muốn chúng trống, bạn có thể kết hợp một chuỗi liệt kê chỉ cho phép "" và một số thập phân hoặc sử dụng một số thập phân không có giá trị.

11
Sử dụng xsi: nil là chính xác, nhưng bạn nên đảm bảo rằng nó nằm trong không gian tên thích hợp: xmlns: xsi = " w3.org/2001/XMLSchema-instance "
STW

Đó là thực sự xmlns:xsi="http://w3.org/2001/XMLSchema-instance". Lưu ý http: //. Điều này rất quan trọng vì chuỗi không gian tên thực sự chỉ là một chuỗi cho trình phân tích cú pháp xml chứ không phải là một uri.
Burak Arslan

9
Heh, tôi tin rằng vẫn còn hơi sai. Nó phải xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance". Lưu ý "www.". Xem w3.org/TR/xmlschema-1/#no-xsi
Janne Mattila 16/2/2015

Như đã nêu trong câu trả lời của tôi, tôi không đồng ý với cách giải thích vì nó không phải là đại diện cho trạng thái của phần tử, mà là sự hạn chế trong việc sử dụng phần tử
Oakcool

2
@ChrisV: Không đúng, xsi:tiền tố phải được khai báo. Trình phân tích cú pháp XML nhận biết không gian tên sẽ từ chối tài liệu XML của bạn nếu bạn cố gắng sử dụng xsi:tiền tố mà không khai báo nó. Thông số kỹ thuật có liên quan ở đây là w3.org/TR/xml-names/#nsc-NSDeclared ("Ràng buộc không gian tên: Tiền tố được khai báo") cho biết các tiền tố chỉ được xác định trước là xml:xmlns:. Lược đồ XML xây dựng trên đầu đặc tả không gian tên XML nhưng không thêm bất kỳ tiền tố được xác định trước nào vào nó, vì việc đó thực sự sẽ vi phạm đặc tả không gian tên XML.
Simon Kissane

9

Không có câu trả lời chính tắc nào, vì về cơ bản XML không có khái niệm null. Nhưng tôi giả sử bạn muốn ánh xạ Xml / Object (vì đồ thị đối tượng có null); vì vậy câu trả lời cho bạn là "bất cứ thứ gì công cụ của bạn sử dụng". Nếu bạn viết xử lý, điều đó có nghĩa là bất cứ điều gì bạn thích. Đối với các công cụ sử dụng Lược đồ XML, xsi:nillà cách để đi. Đối với hầu hết những người lập bản đồ, bỏ qua phần tử / thuộc tính phù hợp là cách để làm điều đó.


8

Nó phụ thuộc vào cách bạn xác nhận XML của bạn. Nếu bạn sử dụng xác thực Lược đồ XML, cách biểu diễn chính xác các nullgiá trị là với xsi:nilthuộc tính.

[ Nguồn ]


7

Các tài liệu trong liên kết w3

http://www.w3.org/TR/REC-xml/#sec-starttags

nói rằng đây là các hình thức được đề nghị.

<test></test>
<test/>

Thuộc tính được đề cập trong câu trả lời khác là cơ chế xác nhận và không phải là đại diện của trạng thái. Vui lòng tham khảo http://www.w3.org/TR/xmlschema-1/#xsi_nil

Lược đồ XML: Các cấu trúc giới thiệu một cơ chế để báo hiệu rằng một phần tử nên được chấp nhận là · hợp lệ · khi nó không có nội dung mặc dù loại nội dung không yêu cầu hoặc thậm chí không nhất thiết phải cho phép nội dung trống. Một phần tử có thể · hợp lệ · không có nội dung nếu nó có thuộc tính xsi: nil với giá trị true. Một phần tử được gắn nhãn phải trống , nhưng có thể mang các thuộc tính nếu được cho phép bởi loại phức tạp tương ứng.

Để làm rõ câu trả lời này: Nội dung

  <Book>
    <!--Invalid construct since the element attribute xsi:nil="true" signal that the element must be empty-->
    <BuildAttributes HardCover="true" Glued="true" xsi:nil="true">
      <anotherAttribute name="Color">Blue</anotherAttribute>
    </BuildAttributes>
    <Index></Index>
    <pages>
      <page pageNumber="1">Content</page>            
    </pages>
    <!--Missing ISBN number could be confusing and misguiding since its not present-->
  </Book>
</Books>

7
Đó là khuyến nghị cho các yếu tố trống rỗng ; Bạn có ý kiến ​​rằng trống === null? Tôi tin rằng có một sự khác biệt giữa hai, mặc dù nó thường là tình huống. Nếu bạn đang đưa ra tuyên bố rằng chúng giống nhau, tôi khuyên bạn nên đề cập đến lập luận đó trong câu trả lời của mình.
Rob Hruska

1
Trống không giống như null; nếu có, câu hỏi stackoverflow này sẽ không bao giờ được hỏi. Câu trả lời này là sai. Tuy nhiên, lập trình viên nên xác định liệu logic sẽ đọc xml được chuẩn bị để xử lý một phần tử bị thiếu hay xsi: nil; nếu không, có thể cần phải sử dụng một trong các hình thức này; nghĩa là, có thể cần phải mất sự phân biệt giữa phần tử null / thiếu và phần tử trống.
ToolmakerSteve

@RobHruska vâng, bạn đúng, đó là định nghĩa của một phần tử trống, nhưng nếu xem xét định nghĩa W3C được chỉ ra bởi KitsuneYMG, nó xác định rằng phần tử phải là null và tôi tin rằng biểu diễn đó là định nghĩa của sau đó là biểu diễn trạng thái hiện tại của nó, vì vậy tôi không đồng ý với câu trả lời đó và tin rằng phần trống là biểu diễn tốt nhất của phần tử null. Ý tưởng rất đơn giản, để duy trì cấu trúc tốt, bạn cần tất cả các yếu tố được thể hiện nếu không bạn sẽ không biết đến sự tồn tại của nó, và do đó có thể hiểu sai về nó.
Oakcool

4

Bạn sử dụng xsi:nilkhi ngữ nghĩa lược đồ của bạn chỉ ra rằng một phần tử có giá trị mặc định và giá trị mặc định sẽ được sử dụng nếu phần tử không có mặt. Tôi phải giả định rằng có những người thông minh mà câu trước không phải là một ý tưởng khủng khiếp, nhưng nó có vẻ như là chín loại xấu đối với tôi. Mọi định dạng XML mà tôi từng làm việc đại diện cho các giá trị null bằng cách bỏ qua phần tử. (Hoặc thuộc tính và chúc may mắn đánh dấu một thuộc tính bằng xsi:nil.)


Nếu trong ứng dụng xuất bản tài liệu, bạn muốn ngày trên trang tiêu đề mặc định thành ngày hiện tại nếu thành phần không có nội dung, thì việc bỏ qua datephần tử hoàn toàn không giúp ích nhiều, vì ứng dụng sẽ không biết bạn muốn ở đâu trên trang tiêu đề bạn muốn ngày xuất hiện. (Nếu phần tử bị bỏ qua chỉ có một vị trí có thể, thì đây không phải là vấn đề; trong các từ vựng tài liệu thực tế, hầu hết các phần tử đều có nhiều vị trí có thể.)
CM Sperberg-McQueen

4

Đơn giản chỉ cần bỏ qua thuộc tính hoặc thành phần hoạt động tốt trong dữ liệu ít chính thức hơn.

Nếu bạn cần thông tin phức tạp hơn, các lược đồ GML thêm thuộc tính nilR Lý do, ví dụ: trong GeoSciML :

  • xsi:nil với giá trị "true" được sử dụng để chỉ ra rằng không có giá trị nào khả dụng
  • nilReasoncó thể được sử dụng để ghi lại thông tin bổ sung cho các giá trị còn thiếu; đây có thể là một trong những lý do GML tiêu chuẩn ( missing, inapplicable, withheld, unknown) hoặc văn bản được chuẩn bị bởi other:hoặc có thể là một liên kết URI để giải thích chi tiết hơn.

Khi bạn trao đổi dữ liệu, vai trò mà XML thường được sử dụng, dữ liệu được gửi cho một người nhận hoặc cho một mục đích nhất định có thể bị che khuất nội dung sẽ có sẵn cho người khác đã trả tiền hoặc có xác thực khác. Biết lý do tại sao nội dung bị thiếu có thể rất quan trọng.

Các nhà khoa học cũng quan tâm đến việc tại sao thông tin bị thiếu. Ví dụ: nếu nó bị loại bỏ vì lý do chất lượng, họ có thể muốn xem dữ liệu xấu ban đầu.


2

Trong nhiều trường hợp, mục đích của giá trị Null là phục vụ cho giá trị dữ liệu không có trong phiên bản trước của ứng dụng của bạn.

Vì vậy, giả sử bạn có tệp xml từ ứng dụng "ReportMaster" phiên bản 1.

Bây giờ trong phiên bản Báo cáo 2, một số thuộc tính khác đã được thêm vào có thể được xác định hoặc không.

Nếu bạn sử dụng đại diện 'không có nghĩa là null', bạn sẽ có khả năng tương thích ngược tự động để đọc tệp xml ReportMaster 1 của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.