2013-04-04 38 views
7

Tôi đang viết xml với XmlWriter. Mã của tôi có nhiều mục như sau:Cách kiểm tra tên của phần tử với WriteEndElement

xml.WriteStartElement("payload"); 
ThirdPartyLibrary.Serialise(results, xml); 
xml.WriteEndElement(); // </payload> 

Vấn đề là phương pháp ThirdPartyLibrary.Serialise không đáng tin cậy. Nó có thể xảy ra (tùy thuộc vào biến số results) mà nó không đóng tất cả các thẻ nó mở ra. Kết quả là, dòng WriteEndElement của tôi bị hỏng, tiêu thụ đóng các thẻ treo của thư viện, thay vì viết </payload>.

Vì vậy, tôi muốn thực hiện cuộc gọi đã kiểm tra để WriteEndElement kiểm tra tên phần tử và ném ngoại lệ trừ khi con trỏ ở phần tử mong đợi.

xml.WriteEndElement("payload"); 

Bạn có thể nghĩ điều này giống như XmlReader.ReadStartElement(name) sẽ ném trừ khi con trỏ ở vị trí mong muốn trong tài liệu.

Tôi làm cách nào để đạt được điều này?


Chỉnh sửa: Trường hợp sử dụng thứ hai cho phương pháp này sẽ làm cho mã của riêng tôi dễ đọc và đáng tin cậy hơn.

+0

Bạn có thể gửi một 'XmlWriter' mới vào' ThirdPartyLibrary.Serialise' và kiểm tra xem nó có dễ hiểu không trước khi thêm nó vào đối tượng 'xml' của bạn? – zimdanen

+0

Bạn có thể xác thực 'kết quả' bằng cách nào đó trước khi chuyển nó tới' Serialise' không? (ví dụ: bạn có thể repro phá vỡ phương pháp nối tiếp khi bạn chuyển vào một số loại kết quả nhất định) – keyboardP

+0

@KeyboardP - thư viện của bên thứ ba thực sự là trình cắm thêm do người dùng cung cấp triển khai giao diện, vì vậy nó không đáng tin cậy. –

Trả lời

0

Cuối cùng, tôi đã viết một phương pháp gia hạn WriteSubtree cung cấp cho API có thể sử dụng này:

using (var resultsXml = xml.WriteSubtree("Results")) 
{ 
    ThirdPartyLibrary.Serialise(results, resultsXml); 
} 

Các phương pháp khuyến nông XmlWriter.WriteSubtree là tương tự như .NET của XmlReader.ReadSubtree. Nó trả về một XmlWriter đặc biệt để kiểm tra kinh doanh. Phương pháp vứt bỏ của nó đóng bất kỳ thẻ nào còn mở.

1

XMLWriter chỉ viết thông tin xml đã cho trong luồng với bất kỳ xác thực nào. Nếu nó thực hiện bất kỳ xác thực nào trong khi viết các thẻ xml, vấn đề về hiệu suất sẽ phát sinh khi tạo tệp xml lớn.

Tạo tệp XML bằng cách sử dụng XMLWriter tùy thuộc vào rủi ro của nhà phát triển. Nếu bạn muốn thực hiện bất kỳ loại xác thực nào như vậy, bạn có thể sử dụng XMLDocument.

Nếu bạn thực sự muốn thực hiện xác thực này trong XMLWriter, bạn phải tạo nhà văn bằng cách sử dụng String hoặc StringBuilder. Bởi vì, nếu bạn sử dụng Stream hoặc TextWriter, bạn không thể đọc thông tin được ghi vào luồng ở giữa văn bản. Trong mỗi bản cập nhật của XML, bạn phải đọc chuỗi và viết phương thức của riêng bạn để xác thực thông tin bằng văn bản.

Tôi đề nghị bạn sử dụng XMLDocument để tạo các loại xml này.

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