2013-11-24 3 views
1

이 코드가 뭐가 잘못 됐는지를 알 수없는 것 같습니다 ... 어떤 생각이 잘못된 것입니다. select는 모든 null 속성과 함께 하나의 항목을 반환합니다. 즉 foreach 루프가 한 번 입력되고 WMServer 서버. [pick 특성]이 null로 설정됩니다.Linq에서 값을 제공하지 않는 코드

var xdoc = XDocument.Load(@"pathtoxmlfile.xml"); 
var wms = from e2 in xdoc.Elements("GISImportConfig").Elements("BaseMapLayers") 
      select new 
      { 
       Url = (string)e2.Attribute("url"), 
       Enabled = (string)e2.Attribute("enabled"), 
       UserName = (string)e2.Attribute("username"), 
       Pasword = (string)e2.Attribute("password"), 
       Layers = e2.Elements("WMLayer") 
      }; 

foreach (var Config in wms) 
{ 
    WMServer server = new WMServer(); 
    server.ServerURL = Config.Url; 
    server.Enabled = Convert.ToBoolean(Config.Enabled); 
    server.UserName = Config.UserName; 
    server.Password = Config.Pasword; 

    foreach (var layers in Config.Layers) 
    { 
     WMLayer layer = new WMLayer(); 
     layer.Group = (string)layers.Attribute("group"); 
     layer.Enabled = Convert.ToBoolean(layers.Attribute("enabled")); 
     layer.Name = (string)layers.Attribute("name"); 
    } 
} 

XML : 당신은 하나의 <BaseMapLayers> 요소를 가지고 있기 때문에

<?xml version="1.0" encoding="utf-8" ?> 
<GISImportConfig OracleServer="*" OracleInstance="*" OracleSchema="*"> 
    <BaseMapLayers> 
    <WMServer url="https://example" enabled="true" username="someuser" password="somepass"> 
     <WMLayer name="0" enabled ="true" group="test"></WMLayer> 
     <WMLayer name="1" enabled ="true" group="test"></WMLayer> 
    </WMServer> 
    <WMServer url="server2" enabled="false" username="" password=""> 
     <WMLayer name="test2" enabled ="true" group="test"></WMLayer> 
    </WMServer> 
    </BaseMapLayers> 
</GISImportConfig> 
+0

'선택 '은 원본 소스의 요소 개수를 변경할 수 없다는 것을 의미합니다 ... –

+0

'xml'에 여분의' '이 있다고 생각합니다. 문제와 관련 있음). – Chris

+0

감사합니다. 소스 xml 파일에 없습니다. 나는 그 질문을 편집했다. – will

답변

2

당신은 하나 개의 결과 만 얻는다면, 그것은 당신이 당신의 쿼리를 찾고있는 하나입니다. .Elements("WMServer") 메서드 호출을 추가하고 작동합니다 :

from e2 in xdoc.Elements("GISImportConfig").Elements("BaseMapLayers").Elements("WMServer") 
select new 
{ 
    Url = (string)e2.Attribute("url"), 
    Enabled = (string)e2.Attribute("enabled"), 
    UserName = (string)e2.Attribute("username"), 
    Pasword = (string)e2.Attribute("password"), 
    Layers = e2.Elements("WMLayer") 
}; 

반환합니다 null 이외의 속성 값이 개 요소를.

0

WMServer 개의 요소를 얻으 려하고있는 중이고 현재 BaseMapLayers 개의 요소 (그 중 하나만 존재)를 선택하고있는 것으로 보입니다.

는이 작업을 수행하여 WMServer 요소를 얻을 수 :

from e2 in xdoc.Descendants("WMServer") 
select new 
{ 
     Url = (string)e2.Attribute("url"), 
     Enabled = (string)e2.Attribute("enabled"), 
     UserName = (string)e2.Attribute("username"), 
     Pasword = (string)e2.Attribute("password"), 
     Layers = e2.Elements("WMLayer") 
}; 

는 당신에게 모든 WMServer 하위 요소를 사로 잡고있다.

잘못 배치 된 WMServer 요소를 찾거나 xml의 해당 특정 위치에있는 요소 만 원하는 경우 MarcinJuraszek이 더 좋은 답변을 포함한다고 생각합니다 (관련 요소 추가).

+0

MarcinJuraszek과 어떻게 다른지에 대한 설명에 감사드립니다. 도움이되었습니다. – will

관련 문제