2013-11-14 58 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')。你還需要在'XmlWriterSettings'上設置'Indent = true'。 –

+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

謝謝你,安德烈!有效!我做的唯一更改是用Xml Writer替換XmlTextWriter。爲了記錄,ReaderCreator()和OutputCreator()是返回TextReader和TextWriter的委託。這有助於單元測試模塊。 – Mdb

+0

@Mdb,很高興我能幫到你。 –