Как установить свойство Settings в XmlTextWriter, чтобы я мог записывать каждый XML-атрибут в отдельной строке?

У меня есть этот фрагмент кода, который сериализует объект в файл. Я пытаюсь вывести каждый атрибут XML в отдельной строке. Код выглядит следующим образом:

public static void ToXMLFile(Object obj, string filePath)
{
    XmlSerializer serializer = new XmlSerializer(obj.GetType());

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.NewLineOnAttributes = true;

    XmlTextWriter writer = new XmlTextWriter(filePath, Encoding.UTF8);
    writer.Settings = settings; // Fails here.  Property is read only.

    using (Stream baseStream = writer.BaseStream)
    {
        serializer.Serialize(writer, obj);
    }
}

Единственная проблема в том, что свойство Settings объекта XmlTextWriter доступно только для чтения.

Как установить свойство Settings для объекта XmlTextWriter, чтобы работало значение NewLineOnAttributes?


Ну, я думал, что мне нужен XmlTextWriter, так как XmlWriter это abstract класс. Немного запутанно, если вы спросите меня. Окончательный рабочий код здесь:

/// <summary>
/// Serializes an object to an XML file; writes each XML attribute to a new line.
/// </summary>
public static void ToXMLFile(Object obj, string filePath)
{
    XmlSerializer serializer = new XmlSerializer(obj.GetType());

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.NewLineOnAttributes = true;

    using (XmlWriter writer = XmlWriter.Create(filePath, settings))
    {
        serializer.Serialize(writer, obj);
    }
}

person Robert Harvey    schedule 23.11.2011    source источник


Ответы (2)


Используйте статический метод Create() для XmlWriter.

XmlWriter.Create(filePath, settings);

Обратите внимание, что вы можете установить свойство NewLineOnAttributes в настройках.

person Polity    schedule 23.11.2011
comment
Он не создавался. Он говорит, что он выполнен, но созданный таким образом объект является нулевым. Примечание: я использовал XmlTextWriter writer = XmlWriter.Create(filePath, settings) as XmlTextWriter; - person Robert Harvey; 23.11.2011
comment
@RobertHarvey - это означает, что XmlWriter.Create(...) не создает XmlTextWriter. Когда вы посмотрите на вывод, вы обнаружите, что он возвращает XmlWellFormedWriter. Однако было бы разумно относиться к нему как к XmlWriter. - person Polity; 23.11.2011
comment
Итак, как мне передать его XmlTextWriter? - person Robert Harvey; 23.11.2011
comment
Ничего, заработало, спасибо. Вы были правы, мне просто нужно было XmlWriter. Класс XmlWriter является классом abstract, но вы все равно можете создавать его экземпляры. И созданные таким образом экземпляры называются как-то иначе. Это просто странно. - person Robert Harvey; 23.11.2011

Я знаю, что вопрос старый, в любом случае можно установить отступ для XMLTextWriter. В отличие от XMLwriter, вам не нужно проходить через настройки; вы должны использовать свойство Formatting:

XmlTextWriter writer = new XmlTextWriter(filePath, Encoding.UTF8);
w.Formatting = Formatting.Indented; 

См. https://msdn.microsoft.com/en-us/library/system.xml.xmltextwriter.formatting(v=vs.110).aspx

person alexlomba87    schedule 13.01.2017