2012-09-09 3 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 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> 

또는를 :

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

이 때문에 XML 그렇게 보이는 문자열이 자동으로 추가됩니까?

답변

2

데이터를 비 직렬화하고 새 값을 추가하고 직렬화하십시오. 그러나 대신 FileMode.Create을 사용하십시오.

+0

+1. 읽기 - 추가 저장은 안전한 접근 방식입니다. OP가 데이터를 계속 추가하려는 경우 다른 답변이 추가되었습니다. –

+0

그래서 deserialized xml에 새 노드를 추가하는 방법. 메신저 XmlSerializer serializer 후 누적 = 새로운 XmlSerializer (typeof (List )); 목록 data = (목록 ) serializer.Deserialize (스트림); 이 변수 데이터로 작업하는 방법? –

+0

@AntonMashikhin'새로운 노드를 deserialize 된 XML에 추가하는 법'. XML 처리가 필요 없습니다. deserialization 후, 당신은 당신의'data'를 가진다. 'data'에 새로운 목표를 추가하고 그것을 직렬화하십시오 –

2

결과 파일은 유효하지 않은 XML이므로 유효한 XML로 역 직렬화에 직접 사용할 수 없습니다.

그러나 표준 클래스로 읽을 수있는 "Xml fragments"는 실제로 유효합니다. XmlReader는 XmlReader.Create 호출의 XmlReaderSettings에서 ConformanceLevel.Frament를 지정할 때 조각을 읽을 수 있습니다. 나는 당신이 그런 리더 (확실하지 않음)로부터 직접 클래스들을 비 직렬화 할 수있을 것이라고 생각한다.

사이드 노트 : 이전 데이터를 읽고, 필요한 것을 추가하고 전체 파일로 다시 직렬화하는 것이 훨씬 쉽습니다 (문제 및 버그는 적음).

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) 
} 
관련 문제