क्या हम XML फ़ाइल को किसी अन्य XML फ़ाइल में आयात कर सकते हैं?


83

क्या हम एक XML फ़ाइल को दूसरी XML फ़ाइल में आयात कर सकते हैं?

मेरा मतलब है कि XML में कोई आयात टैग है जो XML पथ को पैरामीटर के रूप में लेता है और XML को आयात करता है (जिसके लिए पथ प्रदान किया गया है)।

जवाबों:


93

आप एक बाहरी (पार्स) सामान्य इकाई का उपयोग कर सकते हैं ।

आप इकाई को इस तरह घोषित करते हैं:

<!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>

कुछ संदर्भ जो सहायक हो सकते हैं:


1
हाय मैड्स, मैं इस पर अटक रहा हूं, क्या हो रहा है जब मैं आईई में अपनी main.xml फ़ाइल देखता हूं तो मुझे अपने otherFile.xml का पाठ ठीक से मिल रहा है लेकिन जब मैं अपने आवेदन में एक ही अवधारणा का उपयोग करता हूं और अपने xml को XMLNocument पर लोड करता हूं , .net के बाद मुझे अन्य फाइल का पाठ नहीं मिल रहा है। इसके बजाय मैं यह मान रहा हूं कि जो भी लिखा गया है वह मुख्य।एक्सएमएल में लिखा है जो सभी <? xml संस्करण = "1.0" स्टैंडअलोन = "नहीं"?> <!! DOCTREPE doc [<! ENTITY otherFile SYSTEM "otherFile.xml">]> <doc> <foo> <bar> & otherFile; </ bar> </ foo> </ doc> क्या आप मुझे बता सकते हैं कि अगर मुझे इसे लोड करने के लिए कुछ और करना है xmldocument ???
सुमित

3
मैं .NET एपीआई से बहुत परिचित नहीं हूं। हालाँकि, आपको यह देखने की आवश्यकता हो सकती है कि XMLResolverसंपत्ति किसके लिए निर्धारित है। यदि XMLResolver प्रॉपर्टी आपके XMLDocument ऑब्जेक्ट पर सेट नहीं है, तो यह बाहरी संसाधनों को लोड नहीं कर सकता है। msdn.microsoft.com/en-us/library/5fcwybb2.aspx
Mads Hansen

1
क्या क्रोम जैसे ब्राउज़र इसे समझते हैं?
अल्प

3
स्थानीय फ़ाइलों के लिए सुरक्षा कारणों से ब्राउज़र इसे अक्षम कर सकते हैं। क्रोम के लिए उपयोग
टोल

1
.NET में, पिछले अनुमति समस्याओं को प्राप्त करने के लिए XmlResolver (डिफ़ॉल्ट XmlUriResolver बनाकर) और XmlReaderSettings में ProhibitDTD (झूठे) सेट करें। डिफ़ॉल्ट रूप से, ऐसा लगता है कि Windows / .NET सुरक्षा नीति बाहरी संसाधनों को लोड करने की अनुमति नहीं देती है।
जॉन जीसस

26

अन्य उत्तर 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>

1
यह Xinclude और XML बाहरी संस्थाओं के बीच तुलना है, जो दोनों शीर्ष 2 उत्तर हैं और पहले से ही उपयोग उदाहरण दिखाते हैं या प्रदान करते हैं। मुझे लगा कि यह चर्चा में शामिल हो गया और टिप्पणी के लिए बहुत लंबा / जटिल था। इसी तरह सवाल पूछता है 'कर सकते हैं' और 'नहीं', इसलिए एक सामान्यीकृत सवाल का जवाब देने के रूप में, यह दिशात्मकता को स्पष्ट करने की ओर जाता है जो मुझे लगा कि वास्तव में सवाल का इरादा था। विशिष्ट कार्यान्वयन पर अन्य अच्छे संदर्भ। कहा जा रहा है, प्रतिक्रिया के लिए धन्यवाद। मैं इसे शीघ्र ही एक उदाहरण के साथ अद्यतन कर रहा हूँ।
वोटकॉफी

मैं आपकी प्रतिक्रिया और सम्मान की सराहना करता हूं कि आपने एक उदाहरण जोड़कर समस्या को हल करने की कोशिश की, लेकिन मुझे लगता है कि आपका जवाब अभी भी मौलिक रूप से त्रुटिपूर्ण है। आमतौर पर, जब पाठ कहीं और से उद्धृत किया जाता है, तो आपको उस पाठ को एक ब्लॉकचोट में शामिल करना चाहिए (ताकि यह स्पष्ट हो कि आप साहित्यिक चोरी करने की कोशिश नहीं कर रहे हैं) और, इससे भी महत्वपूर्ण बात, ब्लॉककॉट के ऊपर / नीचे अपनी स्वयं की चर्चा प्रदान करें जो बहुत स्पष्ट रूप से बताती है कि आपने क्यों लिखा यह विशेष रूप से पाठ और कैसे यह सवाल का जवाब देने में मदद करता है। यदि वे दोनों बातें और फिर से टिप्पणी करते हैं (तो मुझे सूचित किया जाता है) मैं ख़ुशी से अपनी टिप्पणी को हटा दूंगा और अपना पद छोड़ दूंगा।
दान बेखर

ब्लॉक उद्धरण और टिप्पणियों के साथ अपडेट किया गया
वोट कॉफ़ी

यह एक बेहतर जवाब है! मेरी पहली टिप्पणी को हटा दिया गया और हटा दिया गया जो अब सच नहीं है। मैं अन्य टिप्पणी को संदर्भ के लिए छोड़ दूंगा और भविष्य के पाठकों को बेहतर उत्तर लिखने में आशा करता हूं।
दान बिक्र

11

इस सुविधा को XML Inclusions (XInclude) कहा जाता है । कुछ उदाहरण:


मैंने msdn.microsoft.com/en-us/library/aa302291.aspx के साथ प्रयास किया, लेकिन कोई उपयोग नहीं होने के साथ :( My Xmls main.xml <? Xml version = "1.0"?> <Head> <ii: href शामिल हैं? = " import.xml " xmlns: xi = " w3.org/2003/XInclude" > </ हेड> आयातित। xml <? xml संस्करण = "1.0"?> <पाद> © Contoso Corp, 2003 </ footer> और अंतिम xml मुझे मिलता है। <? xml संस्करण = "1.0"?> <Head> <xi: href = " import.xml " xmlns: xi = " w3.org/2003/XInclude "> </ Head> शामिल करें क्या मैं कुछ गलत कर रहा हूं?
सुमित

जावा में, XInclude के लिए समर्थन स्पष्ट रूप से सक्षम होना चाहिए। हो सकता है कि आपके पुस्तकालय को उसी तैयारी की आवश्यकता हो?
टॉमाज़ नर्कविक्ज़

मैं .net का उपयोग कर रहा था। एक्सएमएल को पार्स करने के लिए, मैं मैड्स सॉल्यूशन द्वारा एक्सएमएल को आयात करने में सक्षम था .. आपके समय के लिए धन्यवाद ..
सुमित

1
libxml इसका समर्थन करता है, बहुत बढ़िया।
ऋषिदि

1
जावा के लिए नीचे की पंक्तियों को जोड़ने की आवश्यकता है- डॉक्यूमेंटब्यूफ्लिफैक्टिव डीबीएफएक्टी = डॉक्यूमेंटब्यूफ्लिफैक्टरी.न्यू इनस्टेंस (); dbFactory.setXIncludeAware (सही);
राहुल साहू

1

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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.