2012-09-09 89 views
0

該應用程序應該不時添加節點到Goals.xml文件。所以它的dynamic。這增加了節點的代碼:刪除XML中的多個XML聲明

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

using (IsolatedStorageFile myIsolatedStorage = 
    IsolatedStorageFile.GetUserStoreForApplication()) 
using (IsolatedStorageFileStream stream = 
    myIsolatedStorage.OpenFile("Goals.xml", FileMode.Append)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(List<Goals>)); 
    using (XmlWriter xmlWriter = XmlWriter.Create(stream, settings)) 
    { 
     serializer.Serialize(
      xmlWriter, 
      GenerateGoalsData(name, description, progress)); 
    } 
} 

private List<Goals> GenerateGoalsData(
    string name, 
    string description, 
    string progress) 
{ 
    List<Goals> data = new List<Goals>(); 
    data.Add(new Goals() { 
      Name=name, 
      Description=description, 
      Progress=progress}); 
    return data; 
} 

,也是我有Goals類。但它會產生不好的XML

<ArrayOfGoals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Goals> 
     <Name>Jack</Name> 
     <Description>lalala</Description> 
     <Progress>97</Progress> 
    </Goals> 
</ArrayOfGoals> 
<ArrayOfGoals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Goals> 
     <Name>Taaaaaa</Name> 
     <Description>nanana</Description> 
     <Progress>50</Progress> 
    </Goals> 
</ArrayOfGoals> 

如何XML刪除重複:

</ArrayOfGoals> 
<ArrayOfGoals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

所以XML看起來像這樣:

<ArrayOfGoals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Goals> 
     <Name>Jack</Name> 
     <Description>lalala</Description> 
     <Progress>97</Progress> 
    </Goals> 
    <Goals> 
     <Name>Taaaaaa</Name> 
     <Description>nanana</Description> 
     <Progress>50</Progress> 
    </Goals> 
</ArrayOfGoals> 

或者如何在節點追加不說字符串被自動添加?

回答

2

反序列化您的數據,添加新值並序列化。但是 使用FileMode.Create而不是FileMode.Append

+0

+1。 Read-add-save是安全的方法。如果OP想要繼續附加數據,則添加另一個答案。 –

+0

因此以及如何將新節點添加到反序列化的xml中。 Im在XmlSerializer serializer = new XmlSerializer(typeof(List )); (列表)serializer.Deserialize(stream);如何使用這個變量數據? –

+0

@AntonMashikhin'如何將新節點附加到反序列化xml'。不需要進行xml處理。反序列化後,你有'數據'。將新目標添加到'data'並序列化它 –

2

生成的文件是無效的XML,因此您將無法將其直接用於反序列化作爲有效的Xml。

但它實際上是有效的「Xml片段」,可以用標準類讀取:當在XmlReader.Create調用的XmlReaderSettings中指定ConformanceLevel.Frament時,XmlReader可以讀取片段。我想你甚至可以直接從這樣的閱讀器反序列化類(不確定)。注意:讀取舊數據會更容易(但更少的問題和錯誤),將您需要的內容和序列化作爲整個文件追溯。

0
XmlRootAttribute root = new XmlRootAttribute("Goals");  
XmlSerializer serializer = new XmlSerializer(typeof(List<Goals>), root); 
XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add(string.Empty, string.Empty); 
using (XmlWriter xmlWriter = XmlWriter.Create(stream, settings)) 
{ 
    serializer.Serialize(xmlWriter, GenerateGoalsData(name, description, progress), ns) 
}