Xdocument не печатает декларацию - PullRequest
16 голосов
/ 29 июня 2009

Я пытаюсь использовать API domainpeople.com и для этого мне нужно использовать 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 ... какие-либо подсказки?

Ответы [ 4 ]

16 голосов
/ 30 июня 2009

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

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

Редактировать: Тот же ответ был дан здесь .

10 голосов
/ 30 июня 2009

Как сохранить? Если я сделаю следующее, объявление 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 />
1 голос
/ 11 октября 2012

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

// 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());
}
0 голосов
/ 30 июня 2009

Вы пытались сохранить XDocument?

xDocument.Save("books.xml");

Посмотрите на этот вопрос how-to-print-xml-version1-0-using-xdocument

Вот документация: XDocument.Save Method

...