2013-08-31 2 views
0

XML을 XDocument로로드하고 요소를 수정 한 다음 저장하는 메소드가 있습니다. 하지만 다시로드 할 때. 이 오류가 발생했습니다 :XDocument 중복 XML 작성

예기치 않은 XML 선언. XML 선언은 문서의 첫 번째 노드 여야하며 앞에 공백 문자를 표시 할 수 없습니다.

XML을 검사하고 XDocument가 변경 사항을 저장하지 않았지만 복제본을 만들고 저장한다는 것을 확인합니다.

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); 
       } 

가 어떻게이 문제를 해결할 수

: 여기 수정하고 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과 같은 새를 저장?

+0

'xDoc.Save (stream);의 바로 전에'stream.SetLength (0);'을 시도하십시오. – Vladimir

답변

3

현재 파일 내용의 끝에 수정 된 문서를 추가하는 것처럼 보입니다. 그래서 나중에 다시 구문 분석 할 수 없습니다.

내가 을 읽고 다른 using 문에 부품 쓰기 분할 것 : 이전 파일 내용을 취소합니다 초 using 문에 FileMode.Truncate 설정

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); 
} 

를, 당신의 문제를 해결해야하는지.

+1

또는 xdoc.Load/Save에 직접 파일 이름을 전달하면 원하는 동작을 정확하게 생성 할 수 있습니다. – dtb

+0

@dtb 파일이 격리 저장소에있는 경우 Windows Phone에서 작동하지 않습니다 (이 경우는 여기에있는 것처럼 보입니다). – MarcinJuraszek

+0

와우, 완벽하게 작동했는데, tks가 너무 많아서 3 시간을 보냈습니다 :) –