2010-02-04 2 views
2

У меня есть иерархические данные, хранящиеся в файле XML. Есть несколько компаний, каждая из которых может иметь несколько направлений бизнеса. Они ведут каждую линию бизнеса в нескольких штатах. И в каждом штате могут быть множественные структуры ставок. Ниже приведен фиктивный образец.Как выполнить поиск XML с использованием запроса LINQ-to_XML

Как написать запрос LINQ to XML для возврата, например, всех структур ставок для данной компании, бизнес-направления и состояния? Или все государства, в которых данная компания предлагает страхование жизни.

Пример: вернуть все тарифы на страхование землетрясения в штате Орегон.

Пример: вернуть все государства, в которых Travelers предлагает страхование жизни.

Я знаю, как это сделать на одном уровне, но не могу понять, как развернуть его глубже. Я просто знаю, что я похлопаю себя по голове и пойду «Дух», как только я получу ответ, но пока я застрял.

<?xml version="1.0" encoding="utf-8" ?> 
<businessData> 
    <company name="StateFarm" id="21"> 
    <lineOfBusiness name="Homeowners" id="24"> 
     <state name="Texas" abbreviation="TX"> 
     <rate structure="A"/> 
     <rate structure="D"/> 
     <rate structure="F"/> 
     </state> 
    </lineOfBusiness> 
    <lineOfBusiness name="Earthquake" id="62"> 
     <state name="California" abbreviation="CA"> 
     <rate structure="A"/> 
     <rate structure="B"/> 
     </state> 
     <state name="Oregon" abbreviation="OR"> 
     <rate structure="A"/> 
     </state> 
     <state name="Washington" abbreviation="WA"> 
     <rate structure="A"/> 
     </state> 
    </lineOfBusiness> 
    <lineOfBusiness name="Fire" id="22"> 
     <state name="California" abbreviation="CA"> 
     <rate structure="A"/> 
     </state> 
    </lineOfBusiness> 
    </company> 
    <company name="Travellers" id="17"> 
    <lineOfBusiness name="Life" id="23"> 
     <state name="Florida" abbreviation="FL"> 
     <rate structure="A"/> 
     <rate structure="C"/> 
     <rate structure="D"/> 
     </state> 
     <state name="Alabama" abbreviation="AL"> 
     <rate structure="A"/> 
     <rate structure="B"/> 
     <rate structure="C"/> 
     </state> 
    </lineOfBusiness> 
    <lineOfBusiness name="Homeowners" id="24"> 
     <state name="Alabama" abbreviation="AL"> 
     <rate structure="X"/> 
     <rate structure="Y"/> 
     <rate structure="X"/> 
     </state> 
     <state name="Arkansas" abbreviation="AR"> 
     <rate structure="C"/> 
     </state> 
     <state name="California" abbreviation="CA"> 
     <rate structure="G"/> 
     </state> 
     <state name="Florida" abbreviation="FL"> 
     <rate structure="D"/> 
     </state> 
     <state name="Georgia" abbreviation="GA"> 
     <rate structure="D"/> 
     </state> 
     <state name="Louisiana" abbreviation="LA"> 
     <rate structure="B"/> 
     </state> 
     <state name="Missouri" abbreviation="MO"> 
     <rate structure="A"/> 
     </state> 
    </lineOfBusiness> 
    <lineOfBusiness name="Auto" id="25"> 
     <state name="California" abbreviation="CA"> 
     <rate structure="T"/> 
     <rate structure="Y"/> 
     <rate structure="Z"/> 
     </state> 
    </lineOfBusiness> 
    </company> 
    <company name="NationWide" id="79"> 
    <lineOfBusiness name="Earthquake" code="EQ" id="62"> 
     <state name="California" abbreviation="CA"> 
     <rate structure="B"/> 
     <rate structure="C"/> 
     <rate structure="D"/> 
     <rate structure="G"/> 
     </state> 
    </lineOfBusiness> 
    </company> 
</businessData> 
+0

Какой язык вы используете? Не могли бы вы опубликовать код «одного уровня глубины», который у вас есть, чтобы мы могли помочь вам увидеть, куда идти дальше? – CoderDennis

ответ

1

Пример: вернуть все тарифы на страхование Совхоз землетрясения в штате Орегон:

var result = from company in XDocument.Load("test.xml").Root.Elements("company") 
      from lineOfBusiness in company.Elements("lineOfBusiness") 
      from state in lineOfBusiness.Elements("state") 
      where company.Attributes("name").First().Value == "StateFarm" && 
        lineOfBusiness.Attributes("name").First().Value == "Earthquake" && 
        state.Attributes("name").First().Value == "Oregon" 
      select state.Elements("rate"); 

Пример: вернуть все состояния, в которых путешественники предлагает страхование жизни:

var result = from company in XDocument.Load("test.xml").Root.Elements("company") 
      from lineOfBusiness in company.Elements("lineOfBusiness") 
      from state in lineOfBusiness.Elements("state") 
      where company.Attributes("name").First().Value == "Travellers" && 
        lineOfBusiness.Attributes("name").First().Value == "Life" 
      select state.Attributes("name").First().Value; 

Конечно это предполагает справедливость документа XML в отношении схемы XSD, поскольку должен присутствовать атрибут .

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