2012-09-10 15 views
8

मैंने हाल ही में वीएस -2010 में एक्सएमएल ऐप के लिए एक छोटा सी # विंडोज फॉर्म/LINQ बनाया है जो एक चीज को छोड़कर, वास्तव में क्या करना है: यह " [] "DOCTYPE टैग के अंत में, जो स्पष्ट रूप से एक विरासत प्रणाली से फ़ाइलों को खारिज कर रहा है।सी # LINQ से एक्सएमएल - डीटीडी हेडर से "[]" वर्ण हटाएं

पहले

<!DOCTYPE ichicsr SYSTEM "http://www.accessdata.fda.gov/xml/icsr-xml-v2.1.dtd"> 

बाद

<!DOCTYPE ichicsr SYSTEM "http://www.accessdata.fda.gov/xml/icsr-xml-v2.1.dtd"[]> 

के बाद फ़ाइल .save समारोह का उपयोग कर कार्यक्रम में सहेजा जाता है ये अक्षर जोड़ दिए जाते हैं: यह एक पहले और बाद में है। कार्यक्रम एक .xml फ़ाइल के चयन की अनुमति देता है, फिर कुछ टैग को हटाकर इसे "साफ़ करता है", फिर उसे सहेजता है। जब प्रक्रिया शुरू होती है, तो फाइलों में DOCTYPE में "[]" नहीं होता है। बचत के बाद, वे करते हैं। LINQ से एक्सएमएल इन्हें जोड़ता है?

क्या प्रोग्राम को इन वर्णों को जोड़ने से रखने का कोई तरीका है?

+1

ऐसा नहीं है कि Linq कुछ भी स्वचालित रूप से जोड़ना होगा संभावना बहुत कम है। आप समस्या का एक छोटा सा उदाहरण क्यों नहीं डालते हैं और इसे यहां पोस्ट करते हैं? – Icarus

उत्तर

11

जाहिर है, जब XDocument एक XML दस्तावेज़ को पार करता है जिसमें दस्तावेज़ प्रकार घोषणा शामिल है, तो कोई खाली "आंतरिक सबसेट" स्वचालित रूप से डाला जाता है यदि कोई अस्तित्व में नहीं है। (आंतरिक सबसेट में [] से घिरा हुआ हिस्सा है)।

परिणाम अच्छी तरह से गठित एक्सएमएल है। आप मोनो पर इस के साथ काम कर रहे हैं, तो

XDocument document = ...; 
if (document.DocumentType != null) 
    document.DocumentType.InternalSubset = null; 
+0

धन्यवाद! ऐसा लगता है कि ऐसा किया है। अब तक यह हर परीक्षा पास कर रहा है। – ewomack

+3

ध्यान दें कि यह वर्तमान में मोनो ('2.10.9') में काम नहीं करता है, क्योंकि आप' InternalSubset 'को शून्य नहीं दे सकते हैं, हालांकि जब आप एक नया' XDocumentType 'बना रहे हैं तो * n * निर्दिष्ट कर सकते हैं। 'Info.plist' को पार्सिंग/सहेजते समय, यह कैच -22 की ओर जाता है: फ़ाइल में' [] 'आउटपुट करने से संकलन मोनो टच में विफल हो जाएगा। एक खाली आंतरिक सबसेट के साथ 'Info.plist' लोड हो रहा है' [] 'उत्सर्जित होने का कारण बनता है, और आप 'इन्टरनेटससेट = null' सेट नहीं कर सकते हैं। और 'XDocument.DocumentType' केवल पढ़ने के लिए है। हाय मैं हूँ! – cod3monk3y

+0

मैंने एक ही चीज़ मारा (मैक पर मोनो का उपयोग करके Info.plist को संशोधित करने के लिए)। XDocument के साथ अपना काम करने के बाद DOCTYPE को संशोधित करने के लिए XmlDocument का उपयोग करके मुझे एक सभ्य कामकाज मिला, और मैंने इसे नीचे पोस्ट किया। जब तक मुझे यह नहीं मिला, मैं कुछ भयानक स्ट्रिंग प्रतिस्थापन या रिसॉर्ट करने वाला था - शूडर - एक्सएमएल रीडर/एक्सएमएलवाइटर। – aggieNick02

7

(cod3monk3y) की तरह के मामलों के लिए: हालांकि, अगर आपके पुराने सिस्टम वह पूरा नहीं कर सकते हैं, आप DTD से आंतरिक सबसेट की स्थापना करके XDocumentType.InternalSubset संपत्ति null को हटा सकते हैं Info.plist को संशोधित करने की तरह, आप XDocument का उपयोग करने के बाद चीजों को ठीक करने के लिए पुरानी एक्सएमएल डॉक्यूमेंट क्लास का उपयोग कर सकते हैं ताकि आपकी एक्सएमएल फाइल बनाने/संशोधित हो सके।

कोड मानती है कि आपके "Info.plist" फ़ाइल पथ infoPlist पर स्थित है:

using System; 
using System.IO; 
using System.Linq; 
using System.Xml; 
using System.Xml.Linq; 

var xDocument = XDocument.Load (infoPlist); 
// Do your manipulations here 
xDocument.Save (infoPlist); 
XmlDocument xmlDocument = new XmlDocument(); 
xmlDocument.Load (infoPlist); 
if (xmlDocument.DocumentType != null) 
{ 
    var name = xmlDocument.DocumentType.Name; 
    var publicId = xmlDocument.DocumentType.PublicId; 
    var systemId = xmlDocument.DocumentType.SystemId; 
    var parent = xmlDocument.DocumentType.ParentNode; 
    var documentTypeWithNullInternalSubset = xmlDocument.CreateDocumentType(name, publicId, systemId, null); 
    parent.ReplaceChild(documentTypeWithNullInternalSubset, xmlDocument.DocumentType); 
} 
xmlDocument.Save (infoPlist); 
संबंधित मुद्दे