2011-09-21 6 views
3

지난 몇 시간 동안 LINQ와 Windows Phone 7의 XML에 어려움을 겪었습니다. 기존 XML 파일에 새 요소를 추가하기 만하면됩니다.LINQ to XML을 사용하여 Windows Phone 7의 기존 XML 파일에 새 요소를 추가하려면 어떻게해야합니까?

XElement newItem = new XElement("item",new XAttribute("id",3), 
           new XElement("content","Buy groceries"), 
           new XElement("status","false")); 

IsolatedStorageFile isFile = IsolatedStorageFile.GetUserStoreForApplication(); 
IsolatedStorageFileStream stream = new IsolatedStorageFileStream("/Items.xml", System.IO.FileMode.Open, isFile); 

XDocument loadedDoc = XDocument.Load(stream); 
loadedDoc.Add(newItem); 
loadedDoc.Save(stream); 

일반적으로 매우 이상한 동작이 발생합니다. 때로는 "IsolatedStorageFileStream에서 허용되지 않는 작업"오류가 발생합니다. 때로는 "루트 요소가 누락되었습니다."때로는 "예기치 않은 XML 선언입니다 .XML 선언은 문서의 첫 번째 노드 여야하며 앞에 공백 문자를 표시 할 수 없습니다." 예를 들어, System.IO.FileMode.Open을 Create로 변경하면 "루트 요소가 없습니다."라는 메시지가 표시되지만 그 이외의 오류가 발생하는 패턴은없는 것 같습니다.

<?xml version="1.0" encoding="utf-8" ?> 
<items> 
    <item id="1"> 
     <content>Get groceries</content> 
     <status>false</status> 
    </item> 
    <item id="2"> 
     <content>Wash your car</content> 
     <status>true</status> 
    </item> 
</items> 

그것은 그보다 간단을하지 않고 내가 선언에 전에 공백이없는 절대적으로 확신 :

이 모든 문제의 원인은 내 XML 파일처럼 보인다 실제 XML 파일 그리고 그 모든 것을 더욱 이상하게 만들기 위해서 나는 XML 파일에 같은 기술을 쓰는 작은 샘플 애플리케이션을 다운로드했다. 나는 그것을 실행하려고하면 나는 아주 익숙한 오류가 점점 오전 : 나는 윈도우 폰 SDK 7.1 베타 설치 http://mobileworld.appamundi.com/blogs/petevickers/archive/2010/12/06/windows-phone-7-linq-to-xml-corruption.aspx/

어제 : 여기

Unexpected XML declaration. The XML declaration must be the first node in the document, and no white space characters are allowed to appear before it.

그 스레드 링크입니다. 그것이 문제의 원인 일 수 있습니까?


격리 된 저장소에서 xml 파일을 찾는 것이 문제인 것처럼 보입니다. 나는 완전히 새로운 프로젝트와 새로운 xml 파일을 만들었습니다. 여전히 점점

// Constructor 
public MainPage() 
{ 
    InitializeComponent(); 
    var isFile = IsolatedStorageFile.GetUserStoreForApplication(); 
    var stream = isFile.OpenFile("file.xml", System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite); 
} 

I'am : : 작업 IsolatedStorageFileStream에 허용되지

내가 가지고있는 유일한 코드를 이잖아. file.xml의 속성을 변경하려고 시도했지만 출력 디렉토리에 작업을 복사했지만 작동하지 않았습니다.

isFile.Dispose(); 

내가 조건부 문을 추가 시도 : 내가 추가하는 시도

if (isFile.FileExists("file.xml"))... 

을하지만 그는 파일을 찾을 수 없습니다.

난 그렇게 내 인생에 붙어 적이있다. 제발 조언 해주세요.

답변

1

당신은 당신이로드 같은 스트림에 저장하는 동안 -하지만 그것은 시작에 "되감기"없이. 격리 저장 스트림이 시크인지는 모르겠지만, 당신은 단지에 코드를 변경 시도 할 수 있습니다 :

XDocument loadedDoc = XDocument.Load(stream); 
loadedDoc.Add(newItem); 
stream.Position = 0; 
loadedDoc.Save(stream); 

또는 문서를로드하고 스트림을 닫은 다음 같은에 새로운 스트림을 열어 파일. 각 사용 후에 스트림을 닫으려면 using 문을 사용해야합니다.

using (var isFile = IsolatedStorageFile.GetUserStoreForApplication()) 
{ 
    using (var stream = isFile.OpenFile("/Items.xml", FileMode.Open)) 
    { 
     XDocument loadedDoc = XDocument.Load(stream); 
     stream.Position = 0; 
     loadedDoc.Add(newItem); 
     loadedDoc.Save(stream); 
    } 
} 
+0

불행히도 내 코드는 "XDocument loadedDoc = XDocument.Load (stream);" 나는 "루트 요소가 없어지는 것"을 얻고있다. 그래서 나는 그것을 시험해 볼 수 없다. – Booyaches

+0

당신이 제안한대로 ** 문장을 사용하여 ** 시도했지만 XDocument loadedDoc = XDocument.Load (stream);에서 "Root element missing"을 얻었습니다. 일반적으로 XML 파일을 스트림으로로드하는 데 문제가있는 것 같습니다. – Booyaches

+0

@Booyaches : 파일이 비어 있음을 의미합니다. – SLaks

관련 문제