2010-01-09 4 views
5

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

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


Edit после resposne @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>? Или мне нужно написать какой-то рекурсивный метод, который будет передаваться каждому дочернему узлу текущего узла?

+0

@shg: Я видел ваш ответ. Является ли LINQ to XML опцией? Или строго .NET 2.0? BTW, вы должны отредактировать свой вопрос и опубликовать этот код здесь вместо того, чтобы публиковать его как ответ, чтобы все было в одном месте для других, потому что это дополнительная информация для вашего вопроса. Вы можете отредактировать это, а затем удалить другой пост. –

+0

@Ahmad Mageed: Я никогда раньше не использовал LINQ to XML, но это вариант. Спасибо за подсказку. Я более подробно рассмотрю его. BTW Я сделал редактирование, которое вы предложили. Я новичок в публикации вопросов о stackoverflow, так что извините за беспорядок. – shg

ответ

3

Что вы подразумеваете под «поскольку 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();