2017-02-06 6 views
0

XDocumentXElementsを追加しようとしています。私はinifileからXMLに移行しようとしていますが、ここでいくつか問題があります。xml XDocument変更ファイルを保存します。

これは私のC#コードです:

public static async Task<List<XElement>> XMLHandling() 
     { 
      StorageFolder storageFolder = ApplicationData.Current.LocalFolder; 
      StorageFile file = await storageFolder.GetFileAsync("sFile.xml"); 

      List<XElement> doc; 
      using (var fileStream = await file.OpenStreamForReadAsync()) 
      { 
       doc = XDocument.Load(fileStream).Descendants("signals").ToList(); 
       //avoid range check 
       doc[0].Add(new XElement("Character", new XElement("Value", "value1"), new XElement("Description", "This is some text"))); 
       using (Stream sr = await file.OpenStreamForWriteAsync()) 
       { 
        doc[0].Save(sr); 
       } 
      } 
      //example 
      return doc; 
     } 

これは前にどのようにファイルの外観です:

<?xml version="1.0"?> 
<catalog> 
    <signals> 

    </signals> 

    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
    </book> 
</catalog> 

と、これは後に、それがどうなるかである:

<?xml version="1.0" encoding="utf-8"?> 
<signals> 
    <Character> 
    <Value>value1</Value> 
    <Description>This is some text</Description> 
    </Character> 
</signals>/title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
    </book> 
</catalog> 

私ができます」なぜ、私はこれをデバッグすることはできません理解していない。 アイデア

+0

あなたが出力として期待するもの投稿してください。あなたが得るものではありません。 – jdweng

答えて

1

ここには少なくとも2つの問題があります。

まず、自分のものを保存していません。ここで

doc = XDocument.Load(fileStream).Descendants("signals").ToList(); 

docsignals要素のリストです。ここで

doc[0].Add(new XElement("Character", new XElement("Value", "value1"), 
    new XElement("Description", "This is some text"))); 

、最初signals要素にCharacter要素を追加します。

doc[0].Save(sr); 

そして最後に、あなたはのみ最初signalsの要素を保存します。これは、あなたの「新しい」文書の最初にsignalsが表示される理由を説明しています。

次に、書き込み先のファイルを切り捨てることはありません。これは、あなたのsignals要素の終わりの後に、何らかの文字化けしたXMLが表示される理由です。これは単にファイル内にあったもので、最初の部分を上書きしただけです。いくつかのオプションでこれを処理するには、this questionが必要です。 1つのオプションは、書き込みを行う前に長さをゼロに設定することです。

ので、このようなものは:

XDocument doc; 

using (var stream = await file.OpenStreamForReadAsync()) 
{ 
    doc = XDocument.Load(stream); 
} 

var signals = doc.Descendants("signals").Single(); 

signals.Add(new XElement("Character", ...)); 

using (var stream = await file.OpenStreamForWriteAsync()) 
{ 
    stream.SetLength(0); 
    doc.Save(stream); 
} 
関連する問題