Ответ 1
Как вы распечатываете содержимое своего XDocument
?
Метод .ToString()
не включает заголовок xml, но метод .Save()
делает.
Изменить: Тот же ответ был дан здесь.
Я пытаюсь использовать 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... любые подсказки?
Как вы распечатываете содержимое своего XDocument
?
Метод .ToString()
не включает заголовок xml, но метод .Save()
делает.
Изменить: Тот же ответ был дан здесь.
Как вы его сохраняете? Если я сделаю следующее, объявление 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 />
Решение для сериализации в строку:
// 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());
}
Вы пытались сохранить XDocument?
xDocument.Save("books.xml");
Посмотрите на этот вопрос how-to-print-xml-version1-0-using-xdocument
Вот документация: XDocument.Save Method