Как сохранить XmlDocument с несколькими настройками отступов? - PullRequest
5 голосов
/ 10 января 2010

Мне нужно сохранить один XmlDocument в файл с правильным отступом (Formatting.Indented), но некоторые узлы с их дочерними элементами должны быть в одной строке (Formatting.None).

Как этого добиться, если XmlTextWriter принять настройки для всего документа?


Редактировать после восстановления @Ahmad Mageed:

Я не знал, что настройки XmlTextWriter могут быть изменены во время записи. Это хорошие новости.

Прямо сейчас я сохраняю xmlDocument (который уже заполнен узлами, если быть точным, это страница .xaml) следующим образом:

XmlTextWriter writer = new XmlTextWriter(filePath, Encoding.UTF8);
writer.Formatting = Formatting.Indented;
xmlDocument.WriteTo(writer);
writer.Flush();
writer.Close();

Разумеется, это позволяет делать отступы во всех узлах. Мне нужно отключить отступ при работе со всеми <Run> узлами.

В вашем примере вы пишете в XmlTextWriter «вручную». Есть ли простой способ просканировать все узлы xmlDocument и записать их в XmlTextWriter, чтобы я мог обнаружить <Run> узлов? Или мне нужно написать какой-нибудь рекурсивный метод, который будет использоваться для каждого дочернего элемента текущего узла?

1 Ответ

3 голосов
/ 10 января 2010

Что вы подразумеваете под "так как XmlTextWriter принимает настройки для всего документа?" Настройки XmlTextWriter могут быть изменены, в отличие от установленной XmlWriter. Точно так же, как вы используете XmlDocument? Пожалуйста, опубликуйте код, чтобы показать, что вы пробовали, чтобы другие лучше понимали проблему.

Если я правильно понял, вы можете изменить форматирование XmlTextWriter так, чтобы оно затрагивало узлы, которые вы хотите отобразить в одной строке. Как только вы закончите, вы вернете форматирование обратно к отступу.

Например, что-то вроде этого:

XmlTextWriter writer = new XmlTextWriter(...);
writer.Formatting = Formatting.Indented;
writer.Indentation = 1;
writer.IndentChar = '\t';

writer.WriteStartElement("root");

// people is some collection for the sake of an example
for (int index = 0; index < people.Count; index++)
{
    writer.WriteStartElement("Person");

    // some node condition to turn off formatting
    if (index == 1 || index == 3)
    {
        writer.Formatting = Formatting.None;
    }

    // write out the node and its elements etc.
    writer.WriteAttributeString("...", people[index].SomeProperty);
    writer.WriteElementString("FirstName", people[index].FirstName);

    writer.WriteEndElement();

    // reset formatting to indented
    writer.Formatting = Formatting.Indented;
}

writer.WriteEndElement();
writer.Flush();
...