0

XML を XDocument にロードし、その要素を変更してから保存するメソッドがあります。しかし、私はそれをリロードするとき。このエラーが発生しました:

予期しない XML 宣言です。XML 宣言はドキュメントの最初のノードでなければならず、その前に空白文字を使用することはできません。

XML をチェックしたところ、XDocument が変更を保存せず、複製を作成して保存したことがわかりました。

この例の xml のように、古いものと新しいものを保存します。

<?xml version="1.0" encoding="UTF-8"?>
<Ungdungs>
  <Ungdung>
    <Name>HERE City Lens</Name>
    <Id>b0a0ac22-cf9e-45ba-8120-815450e2fd71</Id>
    <Path>/Icon/herecitylens.png</Path>
    <Version>Unknown</Version>
    <Category>HERE</Category>
    <Date>Uknown</Date>
  </Ungdung>
<?xml version="1.0" encoding="UTF-8"?>
<Ungdungs>
  <Ungdung>
    <Name>HERE City Lens</Name>
    <Id>b0a0ac22-cf9e-45ba-8120-815450e2fd71</Id>
    <Path>/Icon/herecitylens.png</Path>
    <Version>1.0.0.0</Version>
    <Category>HERE</Category>
    <Date>Uknown</Date>
  </Ungdung>

XML を変更して保存するために使用したコードは次のとおりです。

using (Stream stream = storage.OpenFile("APPSDATA.xml", FileMode.Open, FileAccess.ReadWrite))
                {
                    //var xdoc = XDocument.Load("APPSDATA.xml");
                    var xdoc = XDocument.Load(stream, LoadOptions.None);
                    var listapp = from c in xdoc.Descendants("Ungdung") select c;

                    foreach (XElement app in listapp)
                    {
                        var xElement = app.Element("Name");
                        if (xElement != null)
                            progressIndicator.Text = "Checking " + xElement.Value + "...";
                        var element = app.Element("Id");
                        if (element != null)
                        {
                            var appId = element.Value;
                            var appVersion = await GetAppsVersion(appId);
                            app.Element("Version").Value = appVersion.ToString();
                        }
                    }

                    xdoc.Save(stream);
                }

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

4

現在のファイル コンテンツの最後に変更されたドキュメントを追加しているようです。そのため、後で再度解析することはできません。

読み取り部分と書き込み部分を異なるusingステートメントに分割します。

XDocument xdoc;

using (Stream stream = storage.OpenFile("APPSDATA.xml", FileMode.Open, FileAccess.Read))
{
    xdoc = XDocument.Load(stream, LoadOptions.None);
}

var listapp = from c in xdoc.Descendants("Ungdung") select c;

foreach (XElement app in listapp)
{
    var xElement = app.Element("Name");
    if (xElement != null)
        progressIndicator.Text = "Checking " + xElement.Value + "...";
    var element = app.Element("Id");
    if (element != null)
    {
        var appId = element.Value;
        var appVersion = await GetAppsVersion(appId);
        app.Element("Version").Value = appVersion.ToString();
    }
}

using (Stream stream = storage.OpenFile("APPSDATA.xml", FileMode.Truncate, FileAccess.Write))
{
    xdoc.Save(stream);
}

FileMode.Truncate2 番目のステートメントを設定usingすると、以前のファイルの内容がクリアされ、問題が解決されます。

于 2013-08-31T11:10:56.303 に答える