Cách làm việc với XML Markup tùy chỉnh trong .NET
Cách làm việc với Đánh dấu XML tùy chỉnh trong .NET
Một tài liệu Word có thể chứa dữ liệu XML tùy chỉnh bên cạnh nội dung hiển thị của nó — dữ liệu được dùng để ràng buộc các điều khiển nội dung, lưu trữ siêu dữ liệu đặc thù cho ứng dụng, hoặc nhúng các phần được thêm bởi một ứng dụng khác. Hướng dẫn này cho thấy cách đọc dữ liệu đó, thêm các phần XML tùy chỉnh mới, và kiểm tra các thẻ thông minh kế thừa mà các tài liệu cũ có thể vẫn chứa, bằng cách sử dụng CustomXmlPart, CustomXmlProperty, và SmartTag trong Aspose.Words FOSS cho .NET.
Hướng dẫn từng bước
Bước 1: Đọc dữ liệu XML tùy chỉnh từ một tài liệu
Document.CustomXmlParts trả về một CustomXmlPartCollection — cùng cơ chế mà Word sử dụng để hỗ trợ các điều khiển nội dung được ánh xạ XML. Duyệt qua bộ sưu tập, hoặc gọi GetById(id) khi bạn đã biết phần nào bạn cần, để nhận được một CustomXmlPart. Mỗi phần cung cấp Id, một mảng byte Data chứa XML thô, một DataChecksum để phát hiện liệu dữ liệu đã thay đổi mà không cần so sánh toàn bộ byte, và Schemas — một CustomXmlSchemaCollection liệt kê các sơ đồ XML liên quan tới nó.
Bước 2: Thêm hoặc Cập nhật một phần XML tùy chỉnh
Gọi CustomXmlPartCollection.Add(id, xml) với một chuỗi id và nội dung XML để tạo một phần trực tiếp, hoặc tạo một CustomXmlPart riêng biệt và truyền nó cho Add(part). Để xóa dữ liệu, sử dụng RemoveAt(index) trên một vị trí cụ thể hoặc Clear() để loại bỏ mọi phần. Khi sao chép dữ liệu XML tùy chỉnh giữa các tài liệu, sử dụng CustomXmlPart.Clone() (hoặc Clone() của bộ sưu tập) trên phần nguồn thay vì đọc lại và thêm lại XML thô, sau đó thêm bản sao vào Document.CustomXmlParts của tài liệu đích.
Bước 3: Quản lý các Schema được liên kết với một Phần
CustomXmlPart.Schemas đạt tới một CustomXmlSchemaCollection, nó theo dõi các URI schema liên kết với phần dưới dạng chuỗi thuần thay vì các đối tượng schema đã được phân tích. Sử dụng Add(value) để đăng ký một URI schema, Remove(name) hoặc RemoveAt(index) để loại bỏ một, IndexOf(value) để tìm một, và Clear() để xóa hết chúng. Count báo cáo số lượng URI schema hiện đang được liên kết với phần.
Bước 4: Làm việc với Các Phần Tùy chỉnh Cấp Gói
Không phải mọi phần không hiển thị trong một gói OOXML đều là XML tùy chỉnh. Document.PackageCustomParts trả về một CustomPartCollection các đối tượng CustomPart — các phần tùy ý được lưu trong gói, chẳng hạn các phần được thêm bởi một ứng dụng khác đã mở file. Mỗi CustomPart có một Name, ContentType, RelationshipType, một mảng byte Data, và một cờ IsExternal cho biết nó là một tham chiếu bên ngoài thay vì nội dung nhúng. Add(part), RemoveAt(index) và Clear() quản lý bộ sưu tập theo cùng cách như CustomXmlPartCollection. Kiểm tra PackageCustomParts — không phải CustomXmlParts — khi một phần mà tài liệu của bạn nên có không xuất hiện trong bộ sưu tập XML tùy chỉnh.
Bước 5: Kiểm tra Các Thẻ Thông minh Cũ và Thuộc tính của Chúng
SmartTag là một loại nút (NodeType.SmartTag, được tạo bằng SmartTag(doc)) đại diện cho một thẻ thông minh Word cũ được bọc quanh văn bản đã được nhận dạng. Kiểm tra Element và Uri cùng nhau để xác định bộ nhận dạng nào đã tạo thẻ, sau đó đọc Properties — một CustomXmlPropertyCollection — để lấy dữ liệu có cấu trúc mà bộ nhận dạng đã đính kèm. Trong một CustomXmlPropertyCollection, bộ chỉ mục (ví dụ properties["MyProp"]) hoặc Contains(name) tra cứu một thuộc tính cụ thể, IndexOfKey(name) trả về vị trí của nó, và Remove(name)/RemoveAt(index)/Clear() xóa các mục; mỗi CustomXmlProperty được tạo bằng CustomXmlProperty(name, uri, value) và cung cấp Name, Uri, và Value. Vì SmartTag kế thừa từ CompositeNode, nó cũng tham gia vào cây tài liệu như các nút khác, hỗ trợ Accept(visitor), AcceptStart(visitor), và AcceptEnd(visitor) cho việc duyệt dựa trên DocumentVisitor.
Các vấn đề thường gặp và cách khắc phục
CustomXmlPartCollection.GetById(id) trả về không có gì có thể dùng được. id không khớp với bất kỳ phần nào hiện có trong Document.CustomXmlParts. Liệt kê bộ sưu tập để xác nhận id có tồn tại, hoặc thêm phần trước bằng Add(id, xml).
Một phần được thêm bởi ứng dụng khác không được tìm thấy bằng cách lặp CustomXmlParts. Các phần gói không phải XML được hiển thị thông qua Document.PackageCustomParts, không CustomXmlParts. Kiểm tra PackageCustomParts (a CustomPartCollection) thay vào.
SmartTag.Properties trống mặc dù thẻ đã rõ ràng xuất hiện. Không phải mọi bộ nhận dạng thẻ thông minh đều gắn thuộc tính có cấu trúc. Kiểm tra SmartTag.Element and Uri để xác nhận bộ nhận dạng nào đã tạo thẻ trước khi giả định các thuộc tính cụ thể sẽ có.
Dữ liệu XML tùy chỉnh dường như không liên quan tới điều khiển nội dung mà nó nên được ràng buộc. Các điều khiển nội dung ràng buộc với XML tùy chỉnh thông qua cấu hình ràng buộc dữ liệu riêng của chúng, không tự động với mọi CustomXmlPart in Document.CustomXmlParts. Xác nhận phần nào của một điều khiển nội dung cụ thể thực sự được ràng buộc thay vì giả định mối quan hệ một-một.
Câu hỏi thường gặp
Làm thế nào để tôi thêm dữ liệu XML tùy chỉnh vào tài liệu?
Gọi Document.CustomXmlParts.Add(id, xml) với một chuỗi id và nội dung XML, hoặc tạo một CustomXmlPart riêng biệt và truyền nó tới Add(part).
Sự khác biệt giữa CustomXmlPart và CustomXmlProperty là gì?
CustomXmlPart là một XML data island toàn bộ — một tải trọng byte-array cùng các schema liên quan — được truy cập qua Document.CustomXmlParts. CustomXmlProperty là một cặp tên/giá trị đơn, thường được truy cập qua SmartTag.Properties thay vì trực tiếp từ tài liệu.
Làm thế nào để sao chép dữ liệu XML tùy chỉnh từ tài liệu này sang tài liệu khác?
Gọi Clone() trên CustomXmlPart nguồn, sau đó thêm bản sao vào Document.CustomXmlParts của tài liệu đích bằng Add(part).
SmartTag là gì và tôi sẽ gặp nó khi nào?
SmartTag là một tính năng Word cũ đại diện cho văn bản được nhận dạng và bao bọc bởi bộ nhận dạng smart-tag — một nút tài liệu (NodeType.SmartTag) có Element và Uri xác định bộ nhận dạng, cùng với một bộ sưu tập Properties của các giá trị CustomXmlProperty. Nó xuất hiện trong các tài liệu được viết hoặc chỉnh sửa với smart tags được bật trong các phiên bản Word cũ hơn.
Làm sao tôi biết một tài liệu có bao nhiêu phần XML tùy chỉnh hoặc phần gói?
Đọc Count trên Document.CustomXmlParts (một CustomXmlPartCollection) hoặc Document.PackageCustomParts (một CustomPartCollection) tương ứng.