2017-11-23 15 views
-1

XML 파일에서 중첩 된 요소의 값을 가져 오는 중 문제가 발생합니다. C#의 XML 판독기로 중첩 값 가져 오기

-<Modules> 
-<Modules4> 
    -<Module> 
     <Name>dasd</Name> 
     <Code>dasdasdas</Code> 
     <Credits>40</Credits> 
    </Module> 
    -<Module> 
    <Name>dasdasd</Name> 
    <Code>dasdasd</Code> 
    <Credits>40</Credits> 
    </Module> 
</Modules4> 

<Modules5/> 

<Modules6/> 

</Modules> 

, 난 다음이 질문 경우 중첩 된 요소 "이름", "코드"와 "크레딧"을 얻을, 독자가 "Modules4"요소를 발견하면 조건을 만들기 위해 XML 파일을 시도하고있다 나는 그것을 어디서나 찾을 수 없으므로 그곳으로 나를 안내해주십시오.

using (XmlReader reader = XmlReader.Create("SavedData.xml")) 
      while (reader.Read()) 
     { 
       if (reader.IsStartElement()) 
       { 
        if (reader.Name == "Modules4"){ 

        switch (reader.Name) 
        { 
         case "Name": 
          string name = reader.ReadString(); 
          Console.WriteLine(name); 
          break; 

         case "Code": 
          string Code = reader.ReadString(); 
          Console.WriteLine(Code); 
          break; 

         case "Credits": 

          break; 


        } 
       } 
      } 
     } 
    } 

이것은 내 코드입니다.

감사합니다.

+0

먼저 XmlReader가 필요합니까? XElement를 사용하면 훨씬 쉽습니다. –

+0

나는 XmlReader가 더 쉽다고 생각했다. – Whome123

+0

당신은 매우 잘못 생각했습니다. System.Xml.Linq를 살펴보십시오. –

답변

0

현재 코드의 문제는 reader.Name, 그 아이들 중 하나"Modules4" 결코 없을 때 switch 만에 도달 할 것입니다.

... 
if (reader.IsStartElement()) 
{ 
    if (reader.Name == "Modules4") 
    { 
     ReadModules4(reader.ReadSubtree()); 
    } 
} 
... 

그런 다음 별도의 방법으로 하위 트리를 처리 할 수 ​​있습니다 : 너 내가

나는 ReadSubtree() 방법을 사용하려는 경우

void ReadModules4(XmlReader reader) 
{ 
    while (reader.Read()) 
    { 
     switch (reader.Name) 
     { 
      ... 
     } 
    } 
} 
+0

감사합니다! 정확히 내가 원했던 것! – Whome123

0

을 나는 XML 리더와 XML의 조합을 사용하여 좋아 linq

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XmlReader reader = XmlReader.Create(FILENAME); 

      reader.ReadToFollowing("Modules4"); 
      XmlReader module4Subtree = reader.ReadSubtree(); 
      while (!module4Subtree.EOF) 
      { 
       if (module4Subtree.Name != "Module") 
       { 
        module4Subtree.ReadToFollowing("Module"); 
       } 
       if (!module4Subtree.EOF) 
       { 
        XElement module = (XElement)XElement.ReadFrom(module4Subtree); 
        Module.modules.Add(new Module() { name = (string)module.Element("Name"), code = (string)module.Element("Code"), credits = (int)module.Element("Credits") }); 
       } 

      } 
     } 
    } 
    public class Module 
    { 
     public static List<Module> modules = new List<Module>(); 

     public string name { get; set; } 
     public string code { get; set; } 
     public int credits { get; set; } 
    } 
}