2011-02-09 15 views
6

का उपयोग कर रहा एक XML फ़ाइल सी # में है कि इस तरह é और à के रूप में संस्थाओं में शामिल है (जो किसी भी DTD या ईएनटी घोषणाओं शामिल नहीं है) प्रसंस्करण कर रहा हूँ। जब एक XML फ़ाइल लोड करने का प्रयास मैं निम्न अपवाद प्राप्त ... अघोषित इकाई 'eacute' के लिएसी # में प्रक्रिया एक्सएमएल बाहरी संस्था फ़ाइल

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(record); 

संदर्भ।

मैं उचित ईएनटी फ़ाइल here को ट्रैक करने में सक्षम था। मेरी XML फ़ाइल लोड करते समय ent फ़ाइल का उपयोग करने के लिए मैं XmlDocument कैसे कहूं?

उत्तर

3

.NET 4 से पहले ढांचे के संस्करणों में आप XmlReaderSettings उदाहरण के ProhibitDtd का उपयोग करते हैं।

var settings = new XmlReaderSettings(); 

settings.ProhibitDtd = false; 

string DTD = @"<!DOCTYPE doc [ 
    <!ENTITY % iso-lat1 PUBLIC ""ISO 8879:1986//ENTITIES Added Latin 1//EN//XML"" 
    ""http://www.oasis-open.org/docbook/xmlcharent/0.3/iso-lat1.ent""> 
    %iso-lat1; 
    ]> "; 

string xml = string.Concat(DTD,"<xml><txt>ren&eacute;</txt></xml>"); 

XmlDocument xd = new XmlDocument(); 
xd.Load(XmlReader.Create(new MemoryStream(
     UTF8Encoding.UTF8.GetBytes(xml)), settings)); 

नेट 4.0 से आगे जो आप XmlTextReader पर सेट DtdProcessing.Parse के एक मूल्य के साथ DtdProcessing संपत्ति का उपयोग करें।

XmlDocument xd = new XmlDocument(); 
using (var rdr = new XmlTextReader(new StringReader(xml))) 
{ 
    rdr.DtdProcessing = DtdProcessing.Parse; 
    xd.Load(rdr); 
}  
+0

आपका समाधान मेरे लिए काम किया। मुझे बस सेटिंग्स बदलने की जरूरत है। DtdProcessing = DtdProcessing.Parse; सेटिंग्स के लिए। PrhibitDtd = झूठी; –

+0

ठीक है, महान, ProhibitDtd v4.0 – rene

+0

में बहिष्कृत है यह आसानी से अमान्य एक्सएमएल उत्पन्न कर सकता है, इसलिए यह एक बेवकूफ दृष्टिकोण है। एक्सएमएल स्ट्रिंग की शुरुआत के बारे में एक्सएमएल घोषणा होने पर क्या होता है? यदि ऐसा है, तो आपका कोड अच्छी तरह से गठित एक्सएमएल को उस चीज़ में परिवर्तित करेगा जो अब एक्सएमएल नहीं है। –

2

&eacute; डिफ़ॉल्ट रूप से मान्य XML इकाई नहीं है जबकि यह डिफ़ॉल्ट रूप से मान्य HTML इकाई है।

आपको XML पार्सिंग उद्देश्यों के लिए एक वैध XML इकाई के रूप में &eacute; परिभाषित करने की आवश्यकता होगी।

संपादित करें:

आपको लगता है कि XML में मौजूद ही दाखिल करने की ज़रूरत है अपने बाहरी ईएनटी फ़ाइल का संदर्भ जोड़ने के लिए। फ़ाइल को डिस्क पर सहेजें और इसे उसी निर्देशिका में रखें जैसे दस्तावेज़ को पार्स किया जा रहा है।

<!ENTITY % stuff SYSTEM "iso-lat1.ent"> 
%stuff; 

यदि आप एक अलग मार्ग जाना चाहते हैं तो ENTITY declaration पर जानकारी देखें।

+0

जो सख्ती से सच नहीं है। '& Eacute; 'इकाई को HTML DTD में परिभाषित किया गया है। यह स्वयं एक्सएमएल द्वारा परिभाषित नहीं है लेकिन यह एक्सएमएल नहीं बनाता है - बस परिभाषित नहीं है। हालांकि अच्छा लिंक। केवल कुछ इकाइयों को मानते हुए, उन्हें एक आंतरिक सबसेट में कॉपी करना व्यावहारिक उत्तर होगा। –

+0

@Nic मान्य बिंदु ... तदनुसार संपादित करेगा –

0

this के अनुसार, आपको उन्हें फ़ाइल के भीतर संदर्भित करना होगा; आप यह करने के लिए LoadXml नहीं बता सकते हैं।

3

मैं एक ही समस्या में पड़ गए, और मेरे एक्सएमएल (या DTD) को संशोधित करने के लिए इच्छुक नहीं है, मैं फ्लाई पर संस्थाओं को जोड़ने के लिए अपने खुद के XmlResolver बनाने का फैसला किया।

मेरा कार्यान्वयन वास्तव में कॉन्फ़िगरेशन फ़ाइल से इकाइयों को पढ़ता है, लेकिन यह करने के लिए पर्याप्त होना चाहिए जो आप पूछ रहे हैं। इस उदाहरण में, मैं एक एस्ट्रोफ़े में एक सही एकल घुंघराले उद्धरण को परिवर्तित कर रहा हूं।

class XmlEntityResolver : XmlResolver { 
    public override object GetEntity(Uri absoluteUri, 
            string role, 
            Type ofObjectToReturn) 
    { 
     if (absoluteUri.toString() == "-//MY PUB ID") { 
      MemoryStream ms = new MemoryStream(); 
      StreamWriter sw = new StreamWriter(ms); 
      sw.Write("<!ENTITY rsquo \"'\">"); 
      sw.Flush(); 
      ms.Position = 0; 
      return ms; 
     } 
     else { 
      return base.GetEntity(absoluteUri, role, ofObjectToReturn); 
     } 
    } 
} 

फिर, जब आप अपने एक्सएमएल दस्तावेज़ को घोषित करते हैं, तो बस लोड होने से पहले रिज़ॉल्वर सेट करें।

XmlDocument doc = new XmlDocument(); 
doc.XmlResolver = new XmlEntityResolver(); 
doc.Load(XML_FILE); 
0

2004 में एमएसडीएन आलेख में आपके प्रश्न का उत्तर दिया गया ........ आप इसे यहां पा सकते हैं .......

http://msdn.microsoft.com/en-us/library/aa302289.aspx

+2

वर्णित किया है, जबकि यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, [यह बेहतर होगा] (http://meta.stackexchange.com/q/825 9) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। –

संबंधित मुद्दे