2016-09-02 5 views
0

백업을위한 C# 응용 프로그램을 작성 중이며 모든 백업 세부 정보를 저장하는 XML 파일에 하위 노드 저장과 관련된 문제가 있습니다.XML 하위 노드가 저장되지 않습니다.

자체는 다음과 같아야합니다 파일 :

<backup id="0" totalParts="3" date="0" name="0" description="0"> 
    <backup_part id="0" mboxId="0" muid="0">HASH</backup_part> 
    <backup_part id="1" mboxId="0" muid="0">HASH</backup_part> 
    <backup_part id="2" mboxId="0" muid="0">HASH</backup_part> 
</backup> 

내가 부모 노드 ("백업")를 만들 다음과 같이 :

public static XmlElement AddNewBackupNode(
     XmlDocument xmlDoc, int backupId, int totalBackupParts, 
     string backupDate, string backupName, string backupDescription) 
    { 
     xmlDoc.Load(Program.defaultBackupFile); 
     XmlElement singleBackup = xmlDoc.CreateElement("backup"); 

     var reqNumericAttr = new TupleList<int, string> 
     { 
      { backupId, "id" }, 
      { totalBackupParts, "totalParts" } 
     }; 

     var reqStringAttr = new TupleList<string, string> 
     { 
      { backupDate, "date" }, 
      { backupName, "name" }, 
      { backupDescription, "description" } 
     }; 

     // TODO: remove one foreach 
     foreach (var attr in reqNumericAttr) 
     { 
      XmlAttribute newAttribute = xmlDoc.CreateAttribute(attr.Item2); 
      newAttribute.Value = attr.Item1.ToString(); 
      singleBackup.Attributes.Append(newAttribute); 
     } 

     foreach (var attr in reqStringAttr) 
     { 
      XmlAttribute newAttribute = xmlDoc.CreateAttribute(attr.Item2); 
      newAttribute.Value = attr.Item1.ToString(); 
      singleBackup.Attributes.Append(newAttribute); 
     } 

     xmlDoc.Save(Program.defaultBackupFile); 
     return singleBackup; 
    } 

그 부분은 노력하고 있습니다.

그럼 이걸로 몇 가지 (필요한만큼) 자식 노드를 추가 할 :

public static void AddNewBackupPart(XmlDocument xmlDoc, XmlElement backup, string fileHash, int backupPartId, int mboxId, int uid) 
    { 
     XmlElement backupPart = xmlDoc.CreateElement("backup_part"); 
     backupPart.InnerText = fileHash; 

     var reqAttr = new TupleList<int, string> 
     { 
      { backupPartId, "id" }, 
      { mboxId, "mboxId" }, 
      { uid, "uid" } 
     }; 

     foreach(var attr in reqAttr) 
     { 
      XmlAttribute newAttribute = xmlDoc.CreateAttribute(attr.Item2); 
      newAttribute.Value = attr.Item1.ToString(); 
      backupPart.Attributes.Append(newAttribute); 
     } 

     backup.AppendChild(backupPart); 
     xmlDoc.Save(Program.defaultBackupFile); 
    } 

그 일 때문에 (새로운 자식 노드) 파일에 그 내용을 저장 실패.

2 개 또는 22 개의 자식 노드를 추가하는 것과 같이 여러 가지 방식으로 실행하려고했으나 기본 내용과 마찬가지로 항상 상단과 같은 방식으로 끝납니다.

오류나 경고가 전혀 표시되지 않습니다.

어떤 아이디어가 잘못 되었나요?

편집 : 나는 전화 곳이 AddNewBackupPart입니다 :

// add new backup row to XML 
XmlDocument xmlDoc = XMLparser.LoadBackupsFile(); // TODO: if above can't be done, move that line to XMLparser and Add... method 
XmlElement backupRoot = XMLparser.AddNewBackupNode(xmlDoc, backupId, totalBackupParts, backupDate, backupName, backupDescription); 

     // handle each file in folder 
     int partId = 1; 
     foreach (string fileName in FileHandler.GetAllBackupPackages()) 
     { 
      Console.WriteLine("file: {0}", fileName); 

      // generate Hash 
      string fileHash = FileHandler.GenerateFileChecksum(fileName); 
      Console.WriteLine("hash: {0}", fileHash); 

      // add single node to XML 
      XMLparser.AddNewBackupPart(xmlDoc, backupRoot, fileHash, partId, 000); 

      partId++; 
     } 
+1

당신은 우리에게 코드를 표시 할 수 있습니다 그 전화'AddNewBackupPart (...) 제발? – aprovent

+0

@aprovent 첫 번째 게시물에서 코드를 업데이트했습니다. 죄송합니다. –

+0

@ 토마스 그렇습니다. 첫 번째 게시물의 맨 위에 XML 파일이 어떻게 보이나요? –

답변

0

귀하의 주요 문제는 AddNewBackupNode에서이 작업을 수행하는 것이 :

xmlDoc.Load(Program.defaultBackupFile); 
XmlElement singleBackup = xmlDoc.CreateElement("backup"); 

당신은 당신을 결코 singleBackup에 모든 것을 추가 없지만, 어디서나 문서에 singleBackup을 추가하십시오.

당신이 가장 가능성이 예를 들어,로드 XML에 이미 요소의 자식으로이를 추가 할 XML 문서에 하나 개 이상의 루트 요소를 추가 할 수 없습니다 감안할 때 :

xmlDoc.DocumentElement.AppendChild(singleBackup); 

제쳐두고, 저는 LINQ to XML을보실 것을 강력히 권해 드리겠습니다. 이것은 XmlDocument보다 훨씬 좋은 API이며, 이것보다 훨씬 쉽게 따르는 코드를 작성할 수 있습니다. 그것은 훨씬 적은 코드로 더 선언적으로 작성할 수 있습니다 - 나는 아래의 예를 포함했지만, 대부분의 변수는 실제로 코드가 불완전 : 감안할 때 어디에서 왔는지는 분명하지 않다

var backupParts = FileHandler.GetAllBackupPackages() 
    .Select((fileName, index) => new XElement("backup_part", 
     new XAttribute("id", index + 1), 
     new XAttribute("mboxId", "?"), 
     new XAttribute("uid", "?"), 
     FileHandler.GenerateFileChecksum(fileName))); 

var backup = new XElement("backup", 
    new XAttribute("id", backupId), 
    new XAttribute("totalParts", totalBackupParts), 
    new XAttribute("date", backupDate), 
    new XAttribute("name", backupName), 
    new XAttribute("description", backupDescription), 
    backupParts); 

var doc = XDocument.Load(Program.defaultBackupFile); 

doc.Root.Add(backup); 

doc.Save(Program.defaultBackupFile) 
+0

웃긴다. 정확히 그 부분은 "일하고있다" –

관련 문제