2015-04-13 2 views
0

Я провел исследование и не понимаю, почему мой запрос Linq не работает. Я пытаюсь вернуть список элементов «Грант» из этого XML:Как вернуть список элементов по значению атрибута

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <ArrayOfMapItem> 
    <MapItem> 
     <Id xmlns="Private.CO.path.type">7D2B99FA-0000-0000-0000-000000000000</Id> 
     <Map xmlns="Private.CO.path.type">6557A558-7ED9-4199-8585-6FD8610E4119</Map> 
     <ServiceCollectionId xmlns="Private.CO.path.type">69DB37D4-8A29-4C4E-8671-6C054B9F62E5</ServiceCollectionId> 
     <ServiceCollectionName xmlns="Private.CO.path.type">S-AVCL-CC-01-DF8_SC</ServiceCollectionName> 
     <Services xmlns="Private.CO.path.type">S-AVCL-CC-01-DF8</Services> 
     <Position xmlns="Private.CO.path.type">1350</Position> 
    </MapItem> 
    <MapItem> 
     <Id xmlns="Private.CO.path.type">7D2B99FC-0000-0000-0000-000000000000</Id> 
     <Map xmlns="Private.CO.path.type">80703716-4BCE-4465-902E-6B92A9BD41AC</Map> 
     <ServiceCollectionId xmlns="Private.CO.path.type">A8266306-9384-4CAA-9746-DD9279F9A27E</ServiceCollectionId> 
     <ServiceCollectionName xmlns="Private.CO.path.type">S-AVCL-CC-02-DF8_SC</ServiceCollectionName> 
     <Services xmlns="Private.CO.path.type">S-AVCL-CC-02-DF8</Services> 
     <Position xmlns="Private.CO.path.type">1351</Position> 
    </MapItem> 
    </ArrayOfMapItem> 
    <GrantArrays> 
    <GrantArray> 
     <Grant ResourceId="6557a558-7ed9-4199-8585-6fd8610e4119" PrincipalExternalId="royce" PrincipalType="Group" ResType="Package" Right="Access"> 
     <Conditions xmlns="http://www.here.com/location/bss"> 
      <TimeExpiration Start="2014-05-01T07:00:00" End="9999-12-31T23:59:59.997" Type="TimeExpiration" Expiration="9999-12-31T23:59:59" /> 
     </Conditions> 
     </Grant> 
     <Grant ResourceId="6557a558-7ed9-4199-8585-6fd8610e4119" PrincipalExternalId="peter" PrincipalType="Group" ResType="Package" Right="Access"> 
     <Conditions xmlns="http://www.here.com/location/bss"> 
      <TimeExpiration Start="2014-04-04T19:18:04.963" End="9999-12-31T23:59:59.997" Type="TimeExpiration" Expiration="9999-12-31T23:59:59" /> 
     </Conditions> 
     </Grant> 
    </GrantArray> 
    <GrantArray> 
     <Grant ResourceId="80703716-4bce-4465-902e-6b92a9bd41ac" PrincipalExternalId="royce" PrincipalType="Group" ResType="Package" Right="Access"> 
     <Conditions xmlns="http://www.here.com/location/bss"> 
      <TimeExpiration Start="2014-05-01T07:00:00" End="9999-12-31T23:59:59.997" Type="TimeExpiration" Expiration="9999-12-31T23:59:59" /> 
     </Conditions> 
     </Grant> 
     <Grant ResourceId="80703716-4bce-4465-902e-6b92a9bd41ac" PrincipalExternalId="peter" PrincipalType="Group" ResType="Package" Right="Access"> 
     <Conditions xmlns="http://www.here.com/location/bss"> 
      <TimeExpiration Start="2014-04-04T19:18:05.2" End="9999-12-31T23:59:59.997" Type="TimeExpiration" Expiration="9999-12-31T23:59:59" /> 
     </Conditions> 
     </Grant> 
    </GrantArray> 
    </GrantArrays> 
</root> 

Я подаю запрос Linq в этом методе, передавая метод значение атрибута для RESOURCEID, что, как известно, существуют:

 private static void CheckGrantChanges(string approvemapid) //, string checkmapid) 
    { 
     // approvemapid = "6557a558-7ed9-4199-8585-6fd8610e4119". value confirmed several times 

     var docApproved = XDocument.Load(@"C:\Tools\WorkOnChannelChecker\Daily11ApprovedMapping.xml"); 

     var approveGrants = docApproved.Descendants("GrantArray"); 

     var queryApproved = from a in approveGrants.Elements("Grant") 
          where a.Attribute("ResourceId").Value == approvemapid 
          select a; 
    } 

Я ожидаю, что в «queryApproved» возвращаются два элемента Grant, но он продолжает возвращаться пустым. Пожалуйста, скажите мне, что это такое, я недопонимаю в этом процессе? Спасибо за помощь!

+1

Прекрасно работает для меня! –

+0

может быть просто «{yourguid}» ... означает, что вам нужно удалить фигурные скобки ... –

+0

или вы используете прописные и строчные буквы ... do'where a.Attribute ("ResourceId"). Value.Equals (approvemapid , StringComparison.OrdinalIgnoreCase) ' –

ответ

1

Благодаря Флориану. Проблема заключалась в сравнении строк. Изменение запроса: ...

  var queryApproved = from a in approveGrants.Elements("Grant") 
          where a.Attribute("ResourceId").Value.Equals(approvemapid,StringComparison.OrdinalIgnoreCase) 
          select a; 

... решаемые проблемы.

+0

Добро пожаловать –

Смежные вопросы