2017-02-28 1 views
0

다음 XML 형식이 있다고 가정합니다.select within select select

<data> 
    <appName>Microsoft Word</appName> 
    <appId>123</appId> 
</data> 

XML 내에 여러 데이터 트리가있는 경우 데이터 개체 목록을 작성하는 다음 코드가 있습니다.

List<DataObj> dataObjList = 
    (
     from dataNode in xmlDoc.Elements("data") 
     select new DataObj 
     { 
      appName = dataNode.Element("appName"), 
      appId = dataNode.Element("appId") 
     } 
    ).ToList(); 

그러나, 나는과 같이, 데이터 태그 아래에 추가로 나무를 추가하면 내가 문제로 실행 해요 :

<data> 
    <appName>Microsoft Word</appName> 
    <appId>123</appId> 
    <appOptions> 
      <Win7Compat>true</Win7Compat> 
      <Win7x64Compat>false</Win7x64Compat> 
    </appOptions> 
</data> 

그리고 난 다음 코드를 사용합니다

List<DataObj> dataObjList = 
    (
     from dataNode in xmlDoc.Elements("data") 
     select new DataObj 
     { 
      appName = dataNode.Element("appName"), 
      appId = dataNode.Element("appId") 
      appOptions = 
      (
       from appNode in dataNode.Elements("appOptions") 
       select new AppOptionsObj 
       { 
        win7Compat = appNode.Element("Win7Compat"), 
        win7x64Compat = appNode.Element("Win7x64Compat") 
       } 
      ) as AppOptionsObj, 
     } 
    ).ToList(); 

을 내 appOptions 객체는 항상 null로 처리됩니다. 나는 하위 트리를 제대로 파싱하지 않는다고 느낀다.

+0

그것이 있어야하지 않나요'dataNode.Element에서 appNode ("appOptions")'(단일)에서? 또한 게시 한 내용이 유효한 XML이 아닙니다. 'Win7Compat'과 다음 형제가 닫히지 않았습니다. –

+0

이 코드가 실행 한 코드라고 생각하지 않습니다. 명확한 구문 오류와 오타가 있습니다. 도움이 필요하면 작업중인 코드를 제시해야합니다. 게시 된 코드는 많은 오류를 줄 것입니다. – Hogan

+0

이 XML을 객체로 간단하게 비 직렬화하지 않는 이유는 무엇입니까? –

답변

2

as AppOptionsObj으로 캐스팅했지만 실제로 IEnumerable<AppOptionsObj>을 반환하면 null이됩니다. 당신은 아마 대신 단일 인스턴스를 반환하는 SingleOrDefault()를 사용하려면 :

List<DataObj> dataObjList = 
    (
     from dataNode in xmlDoc.Elements("data") 
     select new DataObj 
     { 
      appName = dataNode.Element("appName"), 
      appId = dataNode.Element("appId") 
      appOptions = 
      (
       from appNode in dataNode.Elements("appOptions") 
       select new AppOptionsObj 
       { 
        win7Compat = appNode.Element("Win7Compat"), 
        win7x64Compat = appNode.Element("Win7x64Compat") 
       } 
      ).SingleOrDefault(), 
     } 
    ).ToList(); 
+0

완벽하게 일했습니다! 정말 고마워. – LeoVannini