इससे पहले कि मैं लोगों द्वारा कूदने से पहले कहूं कि एक्सएमएल पार्सर को परवाह नहीं है कि तत्व खाली हैं या स्वयं बंद हैं, इसलिए एक कारण है कि मैं स्वयं बंद एक्सएमएल तत्वों को अनुमति नहीं दे सकता। कारण यह है कि मैं वास्तव में एसजीएमएल के साथ काम नहीं कर रहा हूं एक्सएमएल और एसजीएमएल डीटीडी जो मैं काम कर रहा हूं वह बहुत सख्त है और इसे अनुमति नहीं देता है।सी # में XmlDocument का उपयोग करके मैं खाली XML तत्वों को स्वयं बंद कर सकता हूं?
मैं क्या है कई हजार SGML फ़ाइलें जो मैं पर XSLT चलाने के लिए आवश्यक है। इसलिए मुझे एक्सएसएलटी लागू करने के लिए अस्थायी रूप से एसजीएमएल को एक्सएमएल में परिवर्तित करना पड़ा। मैंने फिर एक विधि लिखी है जो उन्हें वापस एसजीएमएल में परिवर्तित कर देती है (अनिवार्य रूप से केवल एसजीएमएल घोषणा के साथ एक्सएमएल घोषणा को बदलना और ग्राफिक इकाइयों जैसे किसी भी अन्य इकाई घोषणाओं को वापस लिखना)।
मेरे समस्या यह है कि इस रूपांतरण वापस SGML, के बाद जब मैं अपने SGML संपादक में फ़ाइलों को खोलने, फ़ाइलों को पार्स नहीं है के रूप में खाली तत्वों स्वयं बंद कर दिया गया है है।
किसी को भी पता है कि कैसे मैं हो रहा रोक सकता है जब XmlDocument का उपयोग कर कृपया?
तरीकों कि एक्सएमएल SGML को बदलने और फिर से वापस करने के लिए यह एक उपयुक्त XmlWriter
उपवर्ग और WriteEndElement()
ओवरराइड WriteFullEndElement()
कॉल करने के लिए किया जाएगा नीचे
//converts the SGML file to XML – it’s during this conversion that the
//empty elements get self-closed, i think
private XmlDocument convertToXML(TextReader reader)
{
// setup SgmlReader
Sgml.SgmlReader sgmlReader = new Sgml.SgmlReader();
//sgmlReader.DocType = "HTML";
sgmlReader.WhitespaceHandling = WhitespaceHandling.All;
sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower;
sgmlReader.InputStream = reader;
// create document
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.XmlResolver = null;
doc.Load(sgmlReader);
return doc;
}
// method to apply the XSLT stylesheet to the XML document
private void filterApplic(string applicFilter)
{
string stylesheet = getRequiredStylesheet(); // do this just once
if (stylesheet != "")
{
foreach (string file in FilesToConvert)
{
fileName = Path.GetFileName(file); //gets just the file name from the path
fileNameNoExt = Path.GetFileNameWithoutExtension(file);
string ext = Path.GetExtension(file);
if (ext == ".sgm")
{
try
{
publicIdentifier = getDoctype(file); // gets the sgml declaration
entitiesList = getEntitites(file); // gets the list of entities
TextReader tr = new StreamReader(file);
myDoc = convertToXML(tr);
myDoc.Save(outputFolder + "\\temp.xml");
var myXslTrans = new XslCompiledTransform();
myXslTrans.Load(stylesheet);
myXslTrans.Transform(outputFolder + "\\temp.xml", Path.Combine(outputFolder, fileNameNoExt +".xml"));
XmlDocument convertedDoc = new XmlDocument();
convertedDoc.Load(Path.Combine(outputFolder, fileNameNoExt + ".xml"));
convertToSGM(convertedDoc);
filesTransformed++;
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
}
}
else
{
MessageBox.Show("The stylesheet was retured empty. Cannot perform Applicability filter.");
return;
}
MessageBox.Show("Complete! " + filesTransformed.ToString() + " files filtered for " + applicFilter);
}
//convert files back to SGML
private void convertToSGM(XmlDocument myDoc)
{
using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter, settings))
{
myDoc.WriteTo(xmlTextWriter);
xmlTextWriter.Flush();
string xmltext = stringWriter.GetStringBuilder().ToString();
xmltext = xmltext.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "<!DOCTYPE DMODULE " + publicIdentifier + ">");
xmltext = xmltext.Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", "<!DOCTYPE DMODULE " + publicIdentifier + ">");
if (entitiesList.Count != 0)
{
string entityListAsOne = "";
foreach (string entity in entitiesList)
{
entityListAsOne = entityListAsOne + "\r\n" + entity;
}
xmltext = xmltext.Replace("//EN\">", "//EN\" [" + entityListAsOne + "]>");
}
File.WriteAllText(Path.Combine(outputFolder, fileNameNoExt + ".sgm"), xmltext);
}
}
उत्कृष्ट और व्यापक उत्तर। आपका बहुत बहुत धन्यवाद। उत्तम। –