2010-01-09 26 views
5

Muszę zapisać jeden plik XmlDocument do pliku z odpowiednim wcięciem (Formatting.Indented), ale niektóre węzły z ich dziećmi muszą znajdować się w jednej linii (Formatting.None).Jak zapisać XmlDocument z wieloma ustawieniami wcięć?

Jak to osiągnąć od XmlTextWriter zaakceptować ustawienie całego dokumentu?


Edit po resposne @Ahmad Mageed za:

ja nie wiedziałem, że XmlTextWriter ustawień mogą być modyfikowane podczas pisania. To dobra wiadomość.

Teraz ja ratuję xmlDocument (który jest już wypełniony węzłów, być specyficzna jest .xaml strona) w ten sposób:

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

Umożliwia wcięcia we wszystkich węzłach, oczywiście. Muszę wyłączyć wcięcia w przypadku obsługi wszystkich węzłów <Run>.

W twoim przykładzie piszesz do XmlTextWriter "ręcznie". Czy istnieje prosty sposób na przeszukiwanie wszystkich węzłów XmlDocument i zapisywanie ich w XmlTextWriter, aby wykrywać węzły <Run>? Czy muszę napisać jakąś metodę rekursywną, która trafi do każdego dziecka obecnego węzła?

+0

@shg: Widziałem swoją odpowiedź. Czy LINQ to XML jest opcją? Lub ściśle .NET 2.0? BTW powinieneś edytować swoje pytanie i opublikować ten kod, zamiast zamieszczać go jako odpowiedź, aby wszystko było w jednym miejscu, aby inni mogli go zobaczyć, ponieważ jest to dodatkowe informacje na twoje pytanie. Możesz edytować ten, a następnie usunąć inny wpis. –

+0

@Ahmad Mageed: Nigdy wcześniej nie korzystałem z LINQ do XML, ale jest to opcja. Dzięki za podpowiedź. Przyjrzę mu się bliżej. BTW Dokonałem edycji, którą zasugerowałeś. Jestem nowy w zamieszczaniu pytań na temat stackoverflow, więc przepraszam za bałagan. – shg

Odpowiedz

3

Co rozumiesz przez "od kiedy XmlTextWriter przyjmuje ustawienie dla całego dokumentu?" Ustawienia XmlTextWriter można modyfikować, w przeciwieństwie do ustawionego XmlWriter. Podobnie, w jaki sposób używasz XmlDocument? Opublikuj kod, aby pokazać, co próbowałeś, aby inni mogli lepiej zrozumieć problem.

Jeśli dobrze zrozumiałem, można zmodyfikować formatowanie XmlTextWriter, aby wpłynąć na węzły, które mają być wyświetlane w jednym wierszu. Gdy skończysz, zresetujesz formatowanie z powrotem do wcięcia.

Na przykład coś takiego:

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();