سؤال

وأنا فتح ملف XML باستخدام XmlReader. NET وحفظ الملف في اسم ملف آخر، ويبدو أن التغييرات إعلان DOCTYPE بين الملفين. في حين أن الملف المحفوظ حديثا لا يزال XML صحيح، وكنت أتساءل لماذا أصرت على تغيير العلامات الأصلية.

Dim oXmlSettings As Xml.XmlReaderSettings = New Xml.XmlReaderSettings()
oXmlSettings.XmlResolver = Nothing
oXmlSettings.CheckCharacters = False
oXmlSettings.ProhibitDtd = False
oXmlSettings.IgnoreWhitespace = True

Dim oXmlDoc As XmlReader = XmlReader.Create(pathToOriginalXml, oXmlSettings)
Dim oDoc As XmlDocument = New XmlDocument()
oDoc.Load(oXmlDoc)
oDoc.Save(pathToNewXml)

وفيما يلي (في الوثيقة الأصلية):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">

ويصبح (لاحظ الأحرف [] في النهاية):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd"[]>
هل كانت مفيدة؟

المحلول

وربما يوزع المكتبة العنصر DOCTYPE إلى بنية داخلية ومن ثم تحويل بنية العودة إلى النص. فإنه لا تخزن على شكل سلسلة الأصلي.

نصائح أخرى

وهناك خلل في System.Xml عند تعيين XmlDocument.XmlResolver = فارغة. الحل البديل هو خلق XmlTextWriter مخصص:

    private class NullSubsetXmlTextWriter : XmlTextWriter
    {
        public NullSubsetXmlTextWriter(String inputFileName, Encoding encoding)
            : base(inputFileName, encoding)
        {
        }
        public override void WriteDocType(string name, string pubid, string sysid, string subset)
        {
            if (subset == String.Empty)
            {
                subset = null;
            }
            base.WriteDocType(name, pubid, sysid, subset);
        }
    }

في التعليمات البرمجية الخاصة بك، وخلق NullSubsetXmlTextWriter الجديدة (pathToNewXml، Encoding.UTF8) وتمرير هذا الكائن إلى oDoc.Save () طريقة.

وهنا هو مايكروسوفت دعم القضية حيث يمكنك أن تقرأ عن الحل (فهو يصف الحل ولكن لا يوفر رمز).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top