2013-06-20 31 views
5

Tôi đang cố tạo một DTD cho một tài liệu XML. Tài liệu này có hai con - một chứa dữ liệu có cấu trúc và dữ liệu phi cấu trúc khác ví dụ;Sử dụng DTD, một phần tử có thể được khai báo cho phép bất kỳ nội dung XML nào không?

<doc> 
    <structured> 
    <foo x="9"/> 
    <foo x="4"/> 
    </structured> 
    <unstructured> 
    <hello/> 
    <world x="2"> 
     <hi msg="something"/> 
     <anything/> 
    </world> 
    </unstructured> 
</doc> 

Tôi muốn tạo ra một DTD cho XML ở trên cho phép các yếu tố <unstructured> để chứa bất kỳ XML hợp lệ. Tôi đã thử DTD này;

<!ELEMENT doc (structured,unstructured) 
<!ELEMENT structured (foo*) 
<!ELEMENT foo EMPTY> 
<!ATTLIST foo x CDATA #REQUIRED> 
<!ELEMENT unstructured ANY> 

Nhưng lỗi được tạo ra như thế này;

No declaration for element hello 
No declaration for element world 

..etc

tôi muốn cho phép <unstructured> để chứa bất kỳ XML hợp lệ. Có cách nào trong DTD để cho phép một phần tử được chỉ định chứa bất kỳ XML có thể phân tích cú pháp nào không?

Tôi đang sử dụng PHP 5.3 DOMDocument :: validate.

Trả lời

5

Không, không có.

Bạn đến gần bằng DTD có thể đến bằng cách sử dụng từ khóa ANY. Nhưng ANY khớp với hỗn hợp #PCDATA và mọi phần tử được khai báo trong DTD. Nó không chấp nhận các phần tử không khai báo; Các DTD không có nhiều khái niệm về hiệu lực từng phần.

Đó là một trong những trường hợp sử dụng động lực để giới thiệu các ký tự đại diện trong XSD với các tùy chọn yêu cầu xử lý nghiêm ngặt, lỏng lẻo hoặc bỏ qua các yếu tố phù hợp.

1

Hình dạng hợp lý không hợp lệ, đó là câu trả lời đơn giản. Nếu bạn muốn xác thực tài liệu bằng DTD, bạn sẽ phải khai báo mọi phần tử (không giống như lược đồ xml). Ví dụ làm việc sẽ như sau:

<?xml version="1.0"?> 
<!DOCTYPE doc [ 
<!ELEMENT doc (structured,unstructured)> 
<!ELEMENT structured (foo*)> 
<!ELEMENT hello EMPTY> 
<!ELEMENT world (hi, anything)> 
<!ATTLIST world x CDATA #REQUIRED> 
<!ELEMENT hi EMPTY> 
<!ATTLIST hi msg CDATA #REQUIRED> 
<!ELEMENT anything EMPTY> 
<!ELEMENT foo EMPTY> 
<!ATTLIST foo x CDATA #REQUIRED> 
<!ELEMENT unstructured ANY> 
]> 
<doc> 
    <structured> 
    <foo x="9"/> 
    <foo x="4"/> 
    </structured> 
    <unstructured> 
    <hello/> 
    <world x="2"> 
     <hi msg="something"/> 
     <anything/> 
    </world> 
    </unstructured> 
</doc> 
Các vấn đề liên quan