2013-11-14 5 views
0

У меня есть существующий XML-документ:Форматирование XElement с закладками

<?xml version="1.0" encoding="utf-16"?> 
<property_set_list> 
    <property_set symbol_id="TestPropertySet1"> 
     <property symbol_id="TestName1" id="1" type="8">Test</property> 
     <property symbol_id="TestName2" id="2" type="8"></property> 
    </property_set> 
    <property_set symbol_id="TestPropertySet2"> 

    </property_set> 
</property_set_list> 

я загрузить его и обновить и добавить некоторые свойства. Например:

Недвижимость TestName1 обновляется. Объект TestName 2 остается как есть.

В TestPropertySet2 я добавляю несколько новых свойств.

Выход документа после того, как все манипуляции заключается в следующем:

<?xml version="1.0" encoding="utf-16"?> 
<property_set_list> 
    <property_set symbol_id="TestPropertySet1"> 
     <property symbol_id="TestName1" id="1" type="8">qwerty</property> 
     <property symbol_id="TestName2" id="1" type="8"> 
     </property> 
    </property_set> 
    <property_set symbol_id="TestPropertySet2"> 
     <property symbol_id="localeID" id="1" type="19">1033</property> 
     <property symbol_id="localeID" id="2" type="19">1079</property> 
    </property_set> 
</property_set_list> 

Это код, который я использовал для загрузки и обработки документа:

using (var reader = ReaderCreator()) 
      using (var output = OutputCreator()) 
      using (var xmlWriter = new XmlTextWriter(output)) 
      { 
       xmlWriter.Indentation = 1; 
       xmlWriter.Formatting = Formatting.Indented; 
       xmlWriter.IndentChar = TAB; 

       XDoc = XElement.Load(reader, LoadOptions.None); 
       Namespace = "some namespace"; 

       // some code to update properties 


       // adds new nodes to TestPropertySet2 
       foreach (var localeId in _franchise.LocaleIds) 
       { 
        TestPropertySet2.Add(
         new XElement(
          Namespace + "property", localeId, 
          new XAttribute("symbol_id", "localeID"), 
          new XAttribute("id", i), 
          new XAttribute("type", "19") 
         ) 
        ); 
        i++; 
       } 

       XDoc.Save(xmlWriter); 
      } 

Проблема заключается TestName2 свойство на двух рядах:

<property symbol_id="TestName2" id="1" type="8"> 
      </property> 
+0

В зависимости от того, как вы хотите, чтобы ваш окончательный XML выглядел, вы можете сохранить его с помощью ['XmlWriterSettings'] (http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings (v = vs.110) .aspx) и установка 'IndentChars' в' \ t \ t'. Это приведет к тому, что весь документ будет отложен, используя двойные вкладки. Я не знаю, можете ли вы отступать по разным разделам по-разному (без написания «XmlWriter»). Вам также нужно установить 'Indent = true' в' XmlWriterSettings'. –

+0

После вашего редактирования: Я не знаю, почему это происходит. Я протестировал его на своем компьютере, и он никогда не разбивает теги ''. Возможно, это помогло бы, если бы вы могли опубликовать (целую) часть, где вы сохраняете файл. –

+0

Я обновил весь пост. Надеюсь, теперь это становится яснее. Благодаря! – Mdb

ответ

3

Я не знаю, что ваши ReaderCreator() и OutputCreator() методы делаю. Но следующий код работает по моей просьбе.

string xml = "<property_set_list><property_set symbol_id=\"TestPropertySet1\"><property symbol_id=\"TestName1\" id=\"1\" type=\"8\">qwerty</property>" + 
    "<property symbol_id=\"TestName2\" id=\"1\" type=\"8\"></property></property_set><property_set symbol_id=\"TestPropertySet2\">" + 
    "<property symbol_id=\"localeID\" id=\"1\" type=\"19\">1033</property><property symbol_id=\"localeID\" id=\"2\" type=\"19\">1079</property></property_set></property_set_list>"; 

XElement xdoc = XElement.Parse(xml); 
XElement TestPropertySet2 = xdoc.Elements() 
    .Where(x => x.Attribute("symbol_id").Value == "TestPropertySet2") 
    .FirstOrDefault(); 

TestPropertySet2.Add(
    new XElement(
     "property", "locale_id_val", 
     new XAttribute("symbol_id", "localeID"), 
     new XAttribute("id", "99"), 
     new XAttribute("type", "19") 
     )); 

XmlWriterSettings xws = new XmlWriterSettings(); 
xws.Indent = true; 
xws.IndentChars = "\t\t"; 

FileStream fs = new FileStream("test.xml", FileMode.Create); 
using (XmlWriter xw = XmlWriter.Create(fs, xws)) 
{ 
    xdoc.Save(xw); 
} 
fs.Close(); 

Это дает следующий результат (отступа поддерживается):

<property_set_list> 
    <property_set symbol_id="TestPropertySet1"> 
      <property symbol_id="TestName1" id="1" type="8">qwerty</property> 
      <property symbol_id="TestName2" id="1" type="8"></property> 
    </property_set> 
    <property_set symbol_id="TestPropertySet2"> 
      <property symbol_id="localeID" id="1" type="19">1033</property> 
      <property symbol_id="localeID" id="2" type="19">1079</property> 
      <property symbol_id="localeID" id="99" type="19">locale_id_val</property> 
    </property_set> 

Пожалуйста, не использование XmlWriter вместо XmlTextWriter. Я не знаю, является ли это причиной вашей проблемы. Этот код может быть легко адаптирован к вашей конкретной реализации.

+1

Спасибо, Андрей! Это сработало! Единственное изменение, которое я сделал, это заменить XmlTextWriter на Xml Writer. Для записи ReaderCreator() и OutputCreator() являются делегатами, возвращающими TextReader и TextWriter. Это помогает модулю тестирования модуля. – Mdb

+0

@Mdb, рад, что я мог бы помочь. –

Смежные вопросы