2014-03-03 2 views
-3

의 번호가 자식 노드를 읽고 그래서 currentlty이 같은 보이는 XML 파일을 구문 분석하려고 해요 :XML 파일 읽기 - 하위 노드

<employees> 
    <employee> 
    <id>1</id> 
     <projects> 
      <projectID>7</projectID> 
      <projectID>3</projectID> 
     </projects> 
    </employee> 
    <employee> 
    <id>2</id> 
     <projects> 
      <projectID>4</projectID> 
     </projects> 
    </employee> 
</employees> 

나는 각 직원 읽을려고하고 나타나는 프로젝트 수에 제한이 없습니다. Employee 객체는 문자열 및 목록 (int)입니다.

현재 내가 가진 : XML 파일 자체가 문제가

 XmlDocument doc = new XmlDocument(); 
     doc.Load(path); 
     XmlNodeList xmlNodes = doc.DocumentElement.SelectNodes("/employees/employee"); 
     foreach (XmlNode xmlNode in xmlNodes) 
     { 
      string id; 
      List<int> projects = new List<int>(); 

      id = xmlNode.SelectSingleNode("id").InnerText; 

      //this is the bit. What I have works but it feels like it could 
      //be majorly refined. Is there a better way to construct the foreach below? 

      foreach (XmlNode node in xmlNode.ChildNodes.Item(1)) 
      //index 1 is the projects node 
      { 
       projects.Add(int.Parse(node.InnerText)); 
      } 

      // 

      Employee e = new Employee(id, projects); 
      e.Add(e); 
     } 

경우는 구문 분석을 수용하기 위해 변경 될 수 있습니다.

감사합니다.

+0

XmlDocument를 사용해야합니까? 일반적으로 LINQ to XML (XDocument 등)을 사용하면 작업이 훨씬 간단 해집니다. –

+0

무엇을 수정하고 싶습니까? 성능상의 문제가 있습니까, 아니면 코드가 어떻게 보이는지 맘에 들지 않습니다. –

+0

XMLDocument를 사용하는 경우 열거자를 사용하고 각 노드를 살펴볼 수 있습니다. 예를 들어, - XmlNodeList xmlNodes = doc.DocumentElement.SelectNodes ("/ employees/employee"); IEnumerator enumList = doc.GetEnumerator() 다음 루프를 통해 – HappyLee

답변

1

는 XML에 LINQ 훨씬 쉬울 것입니다 :

var xDoc = XDocument.Load(path); 
var employees = (from e in xDoc.Root.Elements("employee") 
       let projects = e.Element("projects") 
           .Elements("projectID") 
           .Select(p => (int)p) 
           .ToList() 
       let id = (string)e.Element("id") 
       select new Employee(id, projects)).ToList(); 

당신은 그것이 작동되도록하는 using System.Linqusing System.Xml.Linq이 필요합니다.

+0

이 경우 "개체 참조가 설정되지 않음"예외가 발생하는 것 같습니다. 직원이 설정되지 않았거나 인스턴스화되지 않았기 때문일 수 있습니까? 편집 : 절대 신경 쓰지 마라. 나는 "프로젝트"가 있어야했던 곳을 잘못 사용했다. 고마워 :) – user1795294

+0

나는 목록에 만든 감독자의 모든 새로운 인스턴스를 추가하는 문제가. – user1795294