Поздний ответ на старый вопрос, но я постараюсь предоставить больше деталей, чем другие ответы.
То, о чем вы спрашиваете, называется декларация XML .
Прежде всего, XDocument
имеет свойство Declaration
типа XDeclaration
для этого. Вы можете использовать другую перегрузку конструктора XDocument
:
var xdoc = new XDocument(
new XDeclaration("1.0", null, null), // <--- here
new XDocumentType("Response", null, null, "\n"), ...
);
или установите свойство позже:
xdoc.Declaration = new XDeclaration("1.0", null, null);
Но в зависимости от того, как вы сохраните или напишите свой XDocument
позже, объявление (или его части) может быть проигнорировано. Подробнее об этом позже.
Декларация XML может иметь несколько появлений. Вот несколько действительных примеров:
<?xml version="1.0"?> new XDeclaration("1.0", null, null)
<?xml version="1.1"?> new XDeclaration("1.1", null, null)
<?xml version="1.0" encoding="us-ascii"?> new XDeclaration("1.0", "us-ascii", null)
<?xml version="1.0" encoding="utf-8"?> new XDeclaration("1.0", "utf-8", null)
<?xml version="1.0" encoding="utf-16"?> new XDeclaration("1.0", "utf-16", null)
<?xml version="1.0" encoding="utf-8" standalone="no"?> new XDeclaration("1.0", "utf-8", "no")
<?xml version="1.0" encoding="utf-8" standalone="yes"?> new XDeclaration("1.0", "utf-8", "yes")
<?xml version="1.0" standalone="yes"?> new XDeclaration("1.0", null, "yes")
Обратите внимание, что XDeclaration
с радостью примет недопустимые аргументы, так что вам решать, как это сделать правильно.
Во многих случаях первый, <?xml version="1.0"?>
, форма, которую вы запрашиваете, является идеальной (не нужно давать encoding
, если это просто UTF-8 (включая ASCII), и он не нужен для укажите standalone
, если его предполагаемое значение равно "no"
или нет DTD).
Обратите внимание, что xdoc.ToString()
выполняет переопределение из базового класса XNode
(в моей версии .NET) и не включает объявление XML . Вы можете достаточно легко создать метод для решения этой проблемы, например:
public static string ToStringWithDecl(this XDocument d)
=> $"{d.Declaration}{Environment.NewLine}{d}";
Некоторые другие ответы показывают, что XDeclaration
будет соблюдаться, если вы используете xdoc.Save
или xdoc.WriteTo
методы, но это не совсем так:
- Они могут включать декларацию XML, даже если у вас ее нет в
XDocument
- Они могут указывать кодировку, используемую целевым файлом, потоком, записывающим устройством, сборщиком строк и т. Д. Вместо кодировки, которую вы указали, или вместо пропуска кодировки, если вы сделали это в вашем
XDeclaration
- Они могут изменить вашу версию, например, с
1.1
в 1.0
Конечно, когда вы сохраняете / записываете в файл, хорошо, что объявление соответствует истинной кодировке этого файла!
Но иногда, когда вы пишете строку в памяти, вам не нужен utf-16
(даже если вы понимаете, что строки .NET находятся внутри UTF-16). Вы можете использовать метод расширения выше. Или вы можете использовать следующую взломанную версию метода из ответа EricSch:
string xdocString;
using (var hackedWriter = new SuppressEncodingStringWriter())
{
xdoc.Save(hackedWriter);
xdocString = hackedWriter.ToString();
}
где у вас есть:
// a string writer which claims its encoding is null in order to omit encoding in XML declarations
class SuppressEncodingStringWriter : StringWriter
{
public sealed override Encoding Encoding => null;
}