как создать xml с помощью средства записи xml без элемента объявления

Я использую XmlWriter.Create() для получения экземпляра модуля записи, а затем пишу XML, но результат имеет <?xml version="1.0" encoding="utf-16" ?>, как мне сообщить моему средству записи XML, чтобы он не создавал его?


person ninithepug    schedule 26.07.2011    source источник


Ответы (3)


Используйте XmlWriterSettings.OmitXmlDeclaration.

Не забудьте установить для XmlWriterSettings.ConformanceLevel значение ConformanceLevel.Fragment .

person Kirill Polishchuk    schedule 26.07.2011
comment
Из документов, на которые вы ссылаетесь: The XML declaration is always written if ConformanceLevel is set to Document, even if OmitXmlDeclaration is set to true - person Cameron; 26.07.2011
comment
Разве он не будет установлен на документ большую часть времени? - person Cameron; 26.07.2011
comment
@Cameron, странный вопрос... ConformanceLevel.Document по умолчанию, но можно поставить ConformanceLevel.Fragment... - person Kirill Polishchuk; 26.07.2011
comment
Ах, да, я понимаю, знаю :-) Возможно, вы захотите добавить это в свой ответ. А что, если вам нужен уровень соответствия документа (например, для обеспечения единственного корневого узла), но без XML-декларации? - person Cameron; 26.07.2011
comment
@ Кэмерон, я думаю, ты сам ответил на свой вопрос :-) - person Kirill Polishchuk; 26.07.2011
comment
Кирилл, простите за невежество, а как @Cameron сам ответил на вопрос? - person ro͢binmckenzie; 19.07.2016
comment
@ro͢binmckenzie: О, похоже, я буквально ответил на этот вопрос альтернативным решением (ниже). - person Cameron; 19.07.2016
comment
По крайней мере, в .NET Core 3.1 использование OmitXmlDeclaration = false с ConformanceLevel.Default работает нормально, и заголовок объявления XML не записывается (при использовании XmlDocument.Save). - person Dai; 18.06.2021

Вы можете создать подкласс XmlTextWriter и переопределить метод WriteStartDocument(), чтобы он ничего не делал:

public class XmlFragmentWriter : XmlTextWriter
{
    // Add whichever constructor(s) you need, e.g.:
    public XmlFragmentWriter(Stream stream, Encoding encoding) : base(stream, encoding)
    {
    }

    public override void WriteStartDocument()
    {
       // Do nothing (omit the declaration)
    }
}

Применение:

var stream = new MemoryStream();
var writer = new XmlFragmentWriter(stream, Encoding.UTF8);
// Use the writer ...

Ссылка: этот сообщение в блоге от Скотта Хансельмана.

person Cameron    schedule 26.07.2011
comment
спасибо, есть лучший способ? Я не хочу создавать подклассы только для того, чтобы удалить объявление. - person ninithepug; 26.07.2011
comment
@ninithepug: Насколько я знаю, нет, извините. Вы можете обернуть его в статический метод где-нибудь, если вы используете его часто. Это должно помочь сохранить его в чистоте - person Cameron; 26.07.2011
comment
@ninithepug: Кажется, ответ Кирилла (которому не нужен новый класс) может быть лучше (если, конечно, вам не нужен уровень соответствия документа). - person Cameron; 26.07.2011

вы можете использовать XmlWriter.Create() с:

new XmlWriterSettings { 
    OmitXmlDeclaration = true, 
    ConformanceLevel = ConformanceLevel.Fragment 
}

    public static string FormatXml(string xml)
    {
        if (string.IsNullOrEmpty(xml))
            return string.Empty;

        try
        {
            XmlDocument document = new XmlDocument();
            document.LoadXml(xml);
            using (MemoryStream memoryStream = new MemoryStream())
            using (XmlWriter writer = XmlWriter.Create(
                memoryStream, 
                new XmlWriterSettings { 
                    Encoding = Encoding.Unicode, 
                    OmitXmlDeclaration = true, 
                    ConformanceLevel = ConformanceLevel.Fragment, 
                    Indent = true, 
                    NewLineOnAttributes = false }))
            {
                document.WriteContentTo(writer);
                writer.Flush();
                memoryStream.Flush();
                memoryStream.Position = 0;
                using (StreamReader streamReader = new StreamReader(memoryStream))
                {
                    return streamReader.ReadToEnd();
                }
            }
        }
        catch (XmlException ex)
        {
            return "Unformatted Xml version." + Environment.NewLine + ex.Message;
        }
        catch (Exception ex)
        {
            return "Unformatted Xml version." + Environment.NewLine + ex.Message;
        }
    }
person IUB    schedule 03.02.2016