क्या हम एक XML फ़ाइल को दूसरी XML फ़ाइल में आयात कर सकते हैं?
मेरा मतलब है कि XML में कोई आयात टैग है जो XML पथ को पैरामीटर के रूप में लेता है और XML को आयात करता है (जिसके लिए पथ प्रदान किया गया है)।
जवाबों:
आप इकाई को इस तरह घोषित करते हैं:
<!ENTITY otherFile SYSTEM "otherFile.xml">
फिर आप इसे इस तरह से देखें:
&otherFile;
एक पूर्ण उदाहरण:
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE doc [
<!ENTITY otherFile SYSTEM "otherFile.xml">
]>
<doc>
<foo>
<bar>&otherFile;</bar>
</foo>
</doc>
जब XML पार्सर फ़ाइल को पढ़ता है, तो यह इकाई संदर्भ का विस्तार करेगा और सामग्री के हिस्से के रूप में संदर्भित XML फ़ाइल शामिल करेगा।
यदि "otherFile.xml" समाहित है: <baz>this is my content</baz>
तब XML मूल्यांकन किया जाएगा और XML पार्सर द्वारा "देखा गया":
<?xml version="1.0" standalone="no" ?>
<doc>
<foo>
<bar><baz>this is my content</baz></bar>
</foo>
</doc>
कुछ संदर्भ जो सहायक हो सकते हैं:
XMLResolver
संपत्ति किसके लिए निर्धारित है। यदि XMLResolver प्रॉपर्टी आपके XMLDocument ऑब्जेक्ट पर सेट नहीं है, तो यह बाहरी संसाधनों को लोड नहीं कर सकता है। msdn.microsoft.com/en-us/library/5fcwybb2.aspx
अन्य उत्तर 2 सबसे सामान्य दृष्टिकोणों, Xinclude और XML बाहरी संस्थाओं को कवर करते हैं। Microsoft के पास वास्तव में बहुत अच्छा राइटअप है कि क्यों Xinclude को प्राथमिकता दी जानी चाहिए, साथ ही कई उदाहरण कार्यान्वयन भी। मैंने तुलना नीचे उद्धृत की है:
प्रति http://msdn.microsoft.com/en-us/library/aa302291.aspx
क्यों XInclude?
पहला सवाल यह हो सकता है कि "एक्सएमएल बाहरी संस्थाओं के बजाय XInclude का उपयोग क्यों करें?" इसका उत्तर यह है कि एक्सएमएल बाहरी संस्थाओं में कई प्रसिद्ध सीमाएं और असुविधाजनक निहितार्थ हैं, जो प्रभावी रूप से उन्हें सामान्य प्रयोजन समावेश सुविधा से रोकते हैं। विशेष रूप से:
- एक XML बाहरी इकाई पूर्ण-स्वतंत्र स्वतंत्र XML दस्तावेज़ नहीं हो सकती - न ही स्टैंडअलोन XML घोषणा और न ही डॉक्टाइप घोषणा की अनुमति है। प्रभावी रूप से इसका मतलब है कि एक एक्सएमएल बाहरी इकाई में अन्य बाहरी निकाय शामिल नहीं हो सकते हैं।
- एक एक्सएमएल बाहरी इकाई को अच्छी तरह से एक्सएमएल बनाया जाना चाहिए (पहली नज़र में इतना बुरा नहीं है, लेकिन कल्पना करें कि आप अपने XML दस्तावेज़ में नमूना सी # कोड शामिल करना चाहते हैं)।
- बाहरी इकाई को लोड करने में विफलता एक घातक त्रुटि है; किसी भी वसूली की सख्त मनाही है।
- केवल पूरी बाहरी इकाई को ही शामिल किया जा सकता है, केवल एक दस्तावेज के एक हिस्से को शामिल करने का कोई तरीका नहीं है। -बाहरी संस्थाओं को DTD या आंतरिक सबसेट में घोषित किया जाना चाहिए। यह एक भानुमती का पिटारा निहितार्थ से भरा है, जैसे कि तथ्य यह है कि दस्तावेज़ तत्व का नाम डॉक्टाइप घोषणा में होना चाहिए और पाठकों को मान्य करने के लिए आवश्यक हो सकता है कि दस्तावेज़ के पूर्ण सामग्री मॉडल को दूसरों के बीच DTD में परिभाषित किया जाए।
एक्सएमएल बाहरी संस्थाओं को एक समावेशन तंत्र के रूप में उपयोग करने की कमियों को कुछ समय के लिए जाना जाता है और वास्तव में माइक्रोसॉफ्ट और आईबीएम द्वारा 1999 में एक्स 3 को एक्सक्लूजन प्रपोजल को डब्ल्यू 3 सी को प्रस्तुत करने के लिए प्रेरित किया गया था। प्रस्ताव ने एक सामान्य प्रयोजन XML समावेश सुविधा के लिए एक प्रोसेसिंग मॉडल और सिंटैक्स को परिभाषित किया।
चार साल बाद, XML निष्कर्ष के संस्करण 1.0, जिसे Xinclude के रूप में भी जाना जाता है, एक उम्मीदवार की सिफारिश है, जिसका अर्थ है कि W3C का मानना है कि इसे व्यापक रूप से समीक्षा की गई है और इसे हल करने के लिए निर्धारित बुनियादी तकनीकी समस्याओं को संतुष्ट करता है, लेकिन अभी तक नहीं है पूरी सिफारिश।
एक और अच्छी साइट जो विभिन्न प्रकार के उदाहरण कार्यान्वयन प्रदान करती है, वह है https://www.xml.com/pub/a/2002/07/31/xinclude.html । नीचे उनकी साइट से एक आम उपयोग मामला उदाहरण दिया गया है:
<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>
इस सुविधा को XML Inclusions (XInclude) कहा जाता है । कुछ उदाहरण:
Mads Hansen का समाधान अच्छा है लेकिन .NET 4 में बाहरी फ़ाइल को पढ़ने में सफल होने के लिए रिज़ॉल्वर, ProhibitDTD और आदि के बारे में टिप्पणियों में संकेत का उपयोग करने में कुछ समय लगा।
यह कैसे किया जाता है:
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>
events.txt:
<event>
<item1>item1</item1>
<item2>item2</item2>
</event>