2015-03-13 1 views
1

Я пытаюсь создать XMLWriter для XDocument, а также применить к нему настройки, но я не могу понять, как это сделать.XDocument.CreateWriter с использованием XmlWriterSettings

Вот что у меня есть.

 var writerSettings = new XmlWriterSettings() 
     { 
      OmitXmlDeclaration = true, 
      Encoding = Encoding.UTF8 
     }; 
     var request = new XDocument(); 
     using (var writer = request.CreateWriter()) 
     { 
      writer.WriteStartDocument(); 
      writer.WriteStartElement("CUSTOMER"); 
      writer.WriteElementString("ADDRESS", "123 Fake St."); 
      writer.WriteElementString("CITY", "San Jose"); 
      writer.WriteElementString("STATE", "CA"); 
      writer.WriteEndElement(); 
      writer.WriteEndDocument(); 
     } 

Я не могу понять, как применить writerSettings к писателю. Метод XDocument.CreateWriter() не принимает никаких параметров для указания XMLWriterSettings. И после его создания свойство Settings не имеет сеттера.

Если нет возможности использовать CreateWriter() и применять параметры, как еще я могу выполнить что-то эквивалентное и в итоге получить тот же результат?

ответ

0

Если вы используете XDocument.Save(XmlWriter), вы можете создать свой собственный XmlWriter с параметрами XmlWriterSettings и написать содержимое XDocument.

В качестве альтернативы вы можете просто вызвать один из XDocument.ToString overloads, который опускает объявление XML из возвращаемой строки (если это все, что вы хотели настроить).

Ваш пример обновлен ниже, чтобы показать оба варианта:

using System; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var request = new XDocument(); 

     using (var writer = request.CreateWriter()) 
     { 
      writer.WriteStartDocument(); 
      writer.WriteStartElement("CUSTOMER"); 
      writer.WriteElementString("ADDRESS", "123 Fake St."); 
      writer.WriteElementString("CITY", "San Jose"); 
      writer.WriteElementString("STATE", "CA"); 
      writer.WriteEndElement(); 
      writer.WriteEndDocument(); 
     } 

     // XDocument.ToString() will print: 
     //<CUSTOMER> 
     // <ADDRESS>123 Fake St.</ADDRESS> 
     // <CITY>San Jose</CITY> 
     // <STATE>CA</STATE> 
     //</CUSTOMER> 
     Console.WriteLine(request.ToString()); 

     // And here's how to use the XmlWriterSettings with XDocument.Save: 
     var writerSettings = new XmlWriterSettings() 
     { 
      OmitXmlDeclaration = true, 
      Encoding = Encoding.UTF8 
     }; 

     using (var writer = XmlWriter.Create("test.xml", writerSettings)) 
     { 
      request.Save(writer); 
     } 

     // The above will write (you could adjust the XmlWriterSettings to add whitespace): 
     //<CUSTOMER><ADDRESS>123 Fake St.</ADDRESS><CITY>San Jose</CITY><STATE>CA</STATE></CUSTOMER> 
    } 
} 

Или, если вы не используете какой-либо другой функциональности XDocument, вы можете просто создать свой собственный экземпляр XmlWriter в первую очередь, и добавить узлы к этому, и полностью исключить взаимодействие XDocument.

0

В качестве альтернативы, используйте статический метод XmlWriter, который создает()

using (XmlWriter writer = XmlWriter.Create(filePath, settings)) 
{ 
//do your thing 
} 

Я столкнулся с этой проблемой раньше, и я согласен, что это не очень очевидно, особенно при попытке сделать новый XmlWriter ,

Edit: также возможно дубликат How do I set the Settings property in XmlTextWriter, so that I can write each XML attribute on its own line?

Что вы можете обратиться к для дальнейшего чтения, если вы хотите!