XML Schema trong lập trình mạng
XML cũng có ngôn ngữ mô hình hóa dành riêng, được biết như là XML Schema Definition, hay XSD. Một trường hợp sử
dụng phổ biến cho XSD (như với hầu hết ngôn ngữ mô hình hóa) là để khởi tạo các cấu trúc dữ liệu mã nguồn cái khớp
và buộc schema mô tả bởi mô hình dữ liệu đó. Bạn sau đó có thể sử dụng mã nguồn đó để tự động khởi tạo XML cái
tuân thủ với schema đó, đối ngược với viết ra XML thủ công.
Cho một ví dụ cụ thể cái này thực hiện như thế nào trong Python, hãy nhìn vào một lần nữa ví dụ XML của chúng
ta:
<device>
<vendor>Cisco</vendor>
<model>Nexus 7700</model>
<osver>NXOS 6.1</osver></device>
Mục tiêu của bạn là in XML này tới console bằng cách sử dụng một vài code khởi tạo tự động. Bạn có thể làm cái
này bằng cách trước tiên tạo một tài liệu XSD, và sau đó sử dụng công cụ bên thứ ba để khởi tạo Python code từ
tài liệu đó. Sau đó, code đó có thể được sử dụng để in ra XML bạn cần.
Hãy viết một file XSD schema cái mô tả dữ liệu bạn có ý định viết ra:
Trong tài liệu schema này, bạn đang mô tả rằng mỗi phần tử <device> có thể có ba con và rằng dữ liệu trong mỗi
phần tử con phải là string. Không được thể hiện ở đây nhưng hỗ trợ trong tiêu chuẩn kĩ thuật XSD là khả năng
chỉ ra rằng các phần tử con được yêu cầu; nói cách khác, bạn có thể chỉ ra rằng một phần tử <device> phải có
một sự có mặt phần tử con <vendor>.
Bạn có thể sử dụng một tool gọi là PyXB tại bash command line để tạo một Python file cái chứa các trình bày
class object của schema này:
~$ pyxbgen -u schema.xsd -m schema
Cái này tạo schema.py trong thư mục này. Nên, nếu bạn mở một Python prompt tại điểm này, bạn có thể nhập khẩu
file schema này và làm việc với nó. Trong code dưới, bạn đang tạo một thực thể khởi tạo của object được khởi
tạo, thiết lập một vài đặc tính trên nó, và sau đó chuỗi hóa nó thành XML bằng cách sử dụng hàm toxml().
Example 8-19. Generating XML from an XSD schema in Python
>>> import schema
>>> dev = schema.device()
>>> dev.vendor = “Cisco”
>>> dev.model = “Nexus”
>>> dev.osver = “6.1”
>>> dev.toxml(“utf-8″)
‘<?xml version=”1.0″ encoding=”utf-8”?><device><vendor>Cisco</vendor><model>Nexus
</model><osver>6.1</osver></device>’