Я использую XmlWriter.Create()
для получения экземпляра модуля записи, а затем пишу XML, но результат имеет <?xml version="1.0" encoding="utf-16" ?>
, как мне сообщить моему средству записи XML, чтобы он не создавал его?
как создать xml с помощью средства записи xml без элемента объявления
Ответы (3)
Используйте XmlWriterSettings.OmitXmlDeclaration
.
Не забудьте установить для XmlWriterSettings.ConformanceLevel
значение ConformanceLevel.Fragment
.
person
Kirill Polishchuk
schedule
26.07.2011
Из документов, на которые вы ссылаетесь:
The XML declaration is always written if ConformanceLevel is set to Document, even if OmitXmlDeclaration is set to true
- person Cameron; 26.07.2011
Разве он не будет установлен на документ большую часть времени?
- person Cameron; 26.07.2011
@Cameron, странный вопрос...
ConformanceLevel.Document
по умолчанию, но можно поставить ConformanceLevel.Fragment
...
- person Kirill Polishchuk; 26.07.2011
Ах, да, я понимаю, знаю :-) Возможно, вы захотите добавить это в свой ответ. А что, если вам нужен уровень соответствия документа (например, для обеспечения единственного корневого узла), но без XML-декларации?
- person Cameron; 26.07.2011
@ Кэмерон, я думаю, ты сам ответил на свой вопрос :-)
- person Kirill Polishchuk; 26.07.2011
Кирилл, простите за невежество, а как @Cameron сам ответил на вопрос?
- person ro͢binmckenzie; 19.07.2016
@ro͢binmckenzie: О, похоже, я буквально ответил на этот вопрос альтернативным решением (ниже).
- person Cameron; 19.07.2016
По крайней мере, в .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
спасибо, есть лучший способ? Я не хочу создавать подклассы только для того, чтобы удалить объявление.
- person ninithepug; 26.07.2011
@ninithepug: Насколько я знаю, нет, извините. Вы можете обернуть его в статический метод где-нибудь, если вы используете его часто. Это должно помочь сохранить его в чистоте
- person Cameron; 26.07.2011
@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