Xdocument не печатает объявление

Я пытаюсь использовать domainpeople.com API и мне нужно использовать XML.

В настоящее время у меня есть ошибка, говорящая: "apiProtocol не найден" Я предполагаю, что мой XML-документ неверен.

Текущий отправленный xml:

<apiProtocol version="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNameSpaceSchemaLocation="checkrequest.xsd">
  <checkRequest user="ifuzion" password="fish4gold121" reference="123456789">
    <domain name="google.com" /> 
  </checkRequest>
</apiProtocol>

По-видимому, часть <?xml?> не распечатывается.

Мой код в основном похож на:

XDocument xDocument = new XDocument(
new XDeclaration("1.0", "UTF-8", "yes"),
new XElement("Books"));

(я удалил свой код для упрощения, но структура точно подобна).

Есть ли причина, по которой XDocument не распечатывает часть <?xml?>? Кажется, что с XmlDocument он работает, но не с XDocument... любые подсказки?

Ответы

Ответ 1

Как вы распечатываете содержимое своего XDocument?

Метод .ToString() не включает заголовок xml, но метод .Save() делает.

Изменить: Тот же ответ был дан здесь.

Ответ 2

Как вы его сохраняете? Если я сделаю следующее, объявление xml выйдет так, как должно:

XDocument xDocument = new XDocument(
    new XDeclaration("1.0", "UTF-8", "yes"),
    new XElement("Books"));
xDocument.Save(@"c:\temp\file.xml");

Результат выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Books />

Однако, если вместо этого передать экземпляр XmlWriter, кажется, что настройки для этого XmlWriter переопределяют то, что указано в XDocument:

XDocument xDocument = new XDocument(
    new XDeclaration("1.0", "UTF-8", "yes"),
    new XElement("Books"));
StringBuilder sb = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(sb))
{
    xDocument.Save(writer);
}
Console.WriteLine(sb.ToString());

Результат выглядит следующим образом:

<?xml version="1.0" encoding="utf-16" standalone="yes"?><Books />

Обратите внимание на то, как изменилось кодирование на "utf-16", и отступ изменился. Если вы добавите экземпляр XmlWriterSettings, указывающий кодировку (и любые другие параметры, которые вы хотите контролировать), вы получите лучший результат. Следующий код делает то, что вы ожидаете:

XDocument xDocument = new XDocument(
    new XDeclaration("1.0", "UTF-8", "yes"),
    new XElement("Books"));
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.ConformanceLevel = ConformanceLevel.Document;
settings.Indent = true;

using (XmlWriter writer = XmlWriter.Create(@"c:\temp\xdocument.xml", settings))
{
    xDocument.Save(writer);
}

Вывод:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Books />

Ответ 3

Решение для сериализации в строку:

// Default encode as Utf8
Encoding outputEncoding = new UTF8Encoding(/*bom*/false);

// Try to use Xml encoding
if (xml.Declaration != null &&
    xml.Declaration.Encoding.ToNonNull().ToLower() != System.Text.Encoding.UTF8.WebName)
{
    outputEncoding = System.Text.Encoding.GetEncoding(xml.Declaration.Encoding);
}

using (var stream = new MemoryStream())
{
    using (new XmlTextWriter(stream, outputEncoding))
    {
        xml.Save(stream);
    }

    return outputEncoding.GetString(stream.ToArray());
}