Chúng ta có thể nhập một tệp XML vào một tệp XML khác không?
Ý tôi là có bất kỳ thẻ nhập nào trong XML lấy đường dẫn XML làm tham số và nhập XML (cho đường dẫn nào được cung cấp).
Câu trả lời:
Bạn khai báo thực thể như sau:
<!ENTITY otherFile SYSTEM "otherFile.xml">
Sau đó, bạn tham khảo nó như thế này:
&otherFile;
Một ví dụ hoàn chỉnh:
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE doc [
<!ENTITY otherFile SYSTEM "otherFile.xml">
]>
<doc>
<foo>
<bar>&otherFile;</bar>
</foo>
</doc>
Khi trình phân tích cú pháp XML đọc tệp, nó sẽ mở rộng tham chiếu thực thể và bao gồm tệp XML được tham chiếu như một phần của nội dung.
Nếu "otherFile.xml" chứa: <baz>this is my content</baz>
Sau đó, XML sẽ được đánh giá và "nhìn thấy" bởi một trình phân tích cú pháp XML như:
<?xml version="1.0" standalone="no" ?>
<doc>
<foo>
<bar><baz>this is my content</baz></bar>
</foo>
</doc>
Một số tài liệu tham khảo có thể hữu ích:
XMLResolver
tính được đặt thành gì. Nếu thuộc tính XMLResolver không được đặt trên đối tượng XMLDocument của bạn, thì nó có thể không tải các tài nguyên bên ngoài. msdn.microsoft.com/en-us/library/5fcwybb2.aspx
Các câu trả lời khác bao gồm 2 cách tiếp cận phổ biến nhất, Xinclude và các thực thể bên ngoài XML. Microsoft có một bài viết thực sự tuyệt vời về lý do tại sao người ta nên thích Xinclude, cũng như một số triển khai ví dụ. Tôi đã trích dẫn so sánh bên dưới:
Theo http://msdn.microsoft.com/en-us/library/aa302291.aspx
Tại sao XInclude?
Câu hỏi đầu tiên mà người ta có thể hỏi là "Tại sao lại sử dụng XInclude thay vì các thực thể bên ngoài XML?" Câu trả lời là các thực thể bên ngoài XML có một số hạn chế nổi tiếng và các tác động bất tiện, điều này ngăn cản chúng một cách hiệu quả để trở thành cơ sở đưa vào mục đích chung. Đặc biệt:
- Một thực thể bên ngoài XML không thể là một tài liệu XML độc lập hoàn chỉnh — không được phép khai báo XML độc lập hoặc khai báo Doctype. Điều đó có nghĩa là bản thân một thực thể bên ngoài XML không thể bao gồm các thực thể bên ngoài khác.
- Một thực thể bên ngoài XML phải là XML được định dạng tốt (thoạt nhìn thì không tệ lắm, nhưng hãy tưởng tượng bạn muốn đưa mã C # mẫu vào tài liệu XML của mình).
- Không thể tải một thực thể bên ngoài là một lỗi nghiêm trọng; bất kỳ sự phục hồi nào đều bị nghiêm cấm.
- Chỉ có thể bao gồm toàn bộ thực thể bên ngoài, không có cách nào để chỉ bao gồm một phần của tài liệu. -Các thực thể bên ngoài phải được khai báo trong một DTD hoặc một tập hợp con bên trong. Điều này mở ra một Pandora's Box đầy ẩn ý, chẳng hạn như thực tế là phần tử tài liệu phải được đặt tên trong khai báo Doctype và người đọc xác thực có thể yêu cầu mô hình nội dung đầy đủ của tài liệu được xác định trong DTD và những người khác.
Những khiếm khuyết của việc sử dụng các thực thể bên ngoài XML làm cơ chế bao gồm đã được biết đến trong một thời gian và trên thực tế đã dẫn đến việc Microsoft và IBM gửi Đề xuất bao gồm XML lên W3C vào năm 1999. Đề xuất đã xác định một mô hình xử lý và cú pháp cho một cơ sở bao gồm XML có mục đích chung.
Bốn năm sau, phiên bản 1.0 của XML Inclusions, còn được gọi là Xinclude, là Đề xuất Ứng viên, có nghĩa là W3C tin rằng nó đã được xem xét rộng rãi và đáp ứng các vấn đề kỹ thuật cơ bản mà nó đề ra để giải quyết, nhưng vẫn chưa khuyến nghị đầy đủ.
Một trang web tốt khác cung cấp nhiều cách triển khai mẫu là https://www.xml.com/pub/a/2002/07/31/xinclude.html . Dưới đây là một ví dụ về trường hợp sử dụng phổ biến từ trang web của họ:
<book xmlns:xi="http://www.w3.org/2001/XInclude">
<title>The Wit and Wisdom of George W. Bush</title>
<xi:include href="malapropisms.xml"/>
<xi:include href="mispronunciations.xml"/>
<xi:include href="madeupwords.xml"/>
</book>
Tính năng này được gọi là Bao gồm XML (XInclude) . Vài ví dụ:
Giải pháp của Mads Hansen là tốt nhưng để thành công trong việc đọc tệp bên ngoài trong .NET 4, phải mất một thời gian để tìm ra bằng cách sử dụng các gợi ý trong nhận xét về trình phân giải, Pro cấmDTD, v.v.
Đây là cách mà nó được hoàn thành:
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;
settings.XmlResolver = resolver;
var reader = XmlReader.Create("logfile.xml", settings);
XmlDocument doc = new XmlDocument();
doc.Load(reader);
foreach (XmlElement element in doc.SelectNodes("//event"))
{
var ch = element.ChildNodes;
var count = ch.Count;
}
logfile.xml:
<?xml version="1.0"?>
<!DOCTYPE logfile [
<!ENTITY events
SYSTEM "events.txt">
]>
<logfile>
&events;
</logfile>
event.txt:
<event>
<item1>item1</item1>
<item2>item2</item2>
</event>