2009-09-11 33 views
12

Tôi có một đối tượng XDocument hiện có mà tôi muốn thêm một doctype XML vào. Ví dụ:Làm cách nào để thêm loại tài liệu vào XDocument?

XDocument doc = XDocument.Parse("<a>test</a>"); 

tôi có thể tạo ra một XDocumentType sử dụng:

XDocumentType doctype = new XDocumentType("a", "-//TEST//", "test.dtd", ""); 

Nhưng làm thế nào để áp dụng được cho các XDocument hiện hành?

Trả lời

14

Bạn có thể thêm một XDocumentType để hiện có XDocument, nhưng nó phải là phần tử đầu tiên được thêm vào. Các tài liệu xung quanh điều này là mơ hồ.

Nhờ Jeroen để chỉ ra cách tiếp cận thuận tiện khi sử dụng AddFirst trong các nhận xét. Cách tiếp cận này cho phép bạn viết đoạn code sau, trong đó cho thấy làm thế nào để thêm XDocumentType sau XDocument đã có các yếu tố:

var doc = XDocument.Parse("<a>test</a>"); 
var doctype = new XDocumentType("a", "-//TEST//", "test.dtd", ""); 
doc.AddFirst(doctype); 

Cách khác, bạn có thể sử dụng phương pháp Add để thêm một XDocumentType đến một hiện XDocument, nhưng báo trước là không có yếu tố nào khác tồn tại vì nó phải là thứ nhất.

XDocument xDocument = new XDocument(); 
XDocumentType documentType = new XDocumentType("Books", null, "Books.dtd", null); 
xDocument.Add(documentType); 

Mặt khác, sau đây không hợp lệ và sẽ dẫn đến một InvalidOperationException: "Thao tác này sẽ tạo tài liệu có cấu trúc không chính xác".

xDocument.Add(new XElement("Books")); 
xDocument.Add(documentType); // invalid, element added before doctype 
+0

Điều này cũng áp dụng cho XDocument? Liên kết MSDN trỏ tới XmlDocument. – dtb

+1

@dtb: nó có, nhưng tôi không thể tìm thấy nó được ghi trên MSDN cho XDocument. Ngoài ra, hãy xem mã cập nhật và InvalidOperationException. –

+1

Bạn có thể thêm một XDocumentType sau, nhưng bạn phải chắc chắn rằng nó là phần tử đầu tiên trong 'XDocument'. Bạn có thể làm điều đó bằng cách sử dụng 'xDocument.AddFirst (documentType)' thay cho 'xDocument.Add (documentType)'. –

3

Chỉ cần vượt qua nó để XDocument constructor (full example):

XDocument doc = new XDocument(
    new XDocumentType("a", "-//TEST//", "test.dtd", ""), 
    new XElement("a", "test") 
); 

hoặc sử dụng XDocument.Add (các XDocumentType đã được thêm vào trước phần tử root):

XDocument doc = new XDocument(); 
doc.Add(new XDocumentType("a", "-//TEST//", "test.dtd", "")); 
doc.Add(XElement.Parse("<a>test</a>")); 
Các vấn đề liên quan