2009-06-29 4 views
15

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

В настоящее время у меня есть ошибка, говорящая: «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 ... любые подсказки?

ответ

16

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

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

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

+0

Да только видел, что мне нужно StringWriter .... кроме этого кажется, что я могу поместить что-либо в тип кодирования для объявления, он все равно будет использовать UTF-16 ... в настоящее время ищет, чтобы исправить это. – Erick

+3

Сделал йо u найти исправление для проблемы UTF-16? Я испытываю то же самое. Я думаю, это потому, что строки в .NET - это UTF-16, и если вы не кодируете последовательность байтов, всегда будет UTF-16? – User

+0

Похоже, ответ Mörk предлагает потенциальное исправление (http://stackoverflow.com/questions/1060164/xdocument-does-not-print-declaration/1060282#1060282), но вам нужно вручную перевести между 'XDeclaration.Encoding 'string и фактический формат' Encoding'. – patridge

10

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

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

// 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

поясните пожалуйста. – johannes

Смежные вопросы