2012-01-24 2 views
0

Я новичок в LINQ to XML, и я изучаю учебные пособия, но я не нашел того, у которого есть достаточная глубина, чтобы завести меня за мой блок. В моем случае я ударил нашего поставщика для получения информации по данному адресу. Существует вероятность того, что адрес не будет точным совпадением, поэтому они отправят мне XML-файл с возможными адресами.LINQ to XML Требуется глубокая парсиальная информация

Вот данный кусок XML для множественного списка адресов возвращавшихся из адреса запроса:

<POSSIBLE-ADDRESSES> 
       <POS-ADDR> 
       <BUILDING> 
        <Street>1905 W HENDERSON RD          </Street> 
        <City>COLUMBUS      </City> 
        <RiskID>123456</RiskID> 
       </BUILDING> 
       <OCCUPANTS> 
        <OCCUP> 
        <ID>010</ID> 
        <Desc>MC DONALD'S RESTAURANT (1S)  </Desc> 
        </OCCUP> 
        <OCCUP> 
        <ID>015</ID> 
        <Desc>MC DONALD'S RESTAURANT    </Desc> 
        </OCCUP> 
       </OCCUPANTS> 
       </POS-ADDR> 
       <POS-ADDR> 
       <BUILDING> 
        <Street>1821 HENDERSON RD          </Street> 
        <City>UPPER ARLINGTON    </City> 
        <RiskID>1234567</RiskID> 
       </BUILDING> 
       <OCCUPANTS> 
        <OCCUP> 
        <ID>010</ID> 
        <Desc>ARLINGTON SQUARE SHOPPING CTR (1S) </Desc> 
        </OCCUP> 
        <OCCUP> 
        <ID>015</ID> 
        <Desc>1821 SWAN DRY CLNG     </Desc> 
        </OCCUP> 
        <OCCUP> 
        <ID>020</ID> 
        <Desc>4681 ALEX'S BISTRO ON REED/REST </Desc> 
        </OCCUP> 
        <OCCUP> 
        <ID>025</ID> 
        <Desc>4687-93 BLUMEN GARTEN    </Desc> 
        </OCCUP> 
        <OCCUP> 
        <ID>030</ID> 
        <Desc>4697 BLIMPIE/SANDWICH SHOP   </Desc> 
        </OCCUP> 
       </OCCUPANTS> 
       </POS-ADDR> 
      </POSSIBLE-ADDRESSES> 

Теперь то, что я делаю, это вытащить все здания (заметьте там может быть много больше, чем это) следующим и затем связать, что в списке - не Бигги:

var qBuildings = from LOP in loaded.Descendants("BUILDING") 
    select new 
    { 
     BuildingName = LOP.Element("Street").Value, 
     RiskId = LOP.Element("RiskID").Value 
    }; 

Это дает мне все здания, которые мне нужны вместе с их риска идентификаторов.

Теперь кикер - это то, как вытащить «обитателей», когда пользователь выбирает данное здание на основе идентификатора риска, - первый идентификатор риска «123456». Поэтому, если пользователь выбирает это здание, он выйдет и захватит каждого жильца, увлажняющего класс-обитатель, и добавит этот класс в список людей, которые затем привяжут к другому списку.

Все, что я пробовал до сих пор, имел плохие результаты, просто пытаясь достать пассажиров. Я знаю, что это должно быть вопросом навигации, но я не могу построить запрос таким образом, чтобы он возвращал что-нибудь полезное. Каждый идентификатор риска уникален, и каждое здание не может иметь ни одного, ни большого количества пассажиров. Поэтому я теряюсь в том, как тянуть оккупантов.

Любая помощь будет оценена по достоинству.

ответ

0

Мне кажется, вы хотите выбрать оккупантов из pos-addr, чье здание имеет определенный риск. В LINQ-to-XML это может выглядеть так:

var posAddr = 
    (from pos in possibleAddresses.Elements("POS-ADDR") 
    where (int)pos.Element("BUILDING").Element("RiskID") == riskIdToLookFor 
    select pos) 
    .Single(); 

var occupants = 
    from o in posAddr.Element("OCCUPANTS").Elements("OCCUP") 
    select new 
    { 
     Description = (string)o.Element("DESC") 
    } 
+0

Я воспринимаю Вселенную как одно уравнение, и это так просто. Ничего себе, это просто и прекрасно работает (с небольшим количеством настроек, чтобы защитить невиновность (riskID на самом деле является строкой и нуждается в защите). Мне пришлось немного переместиться по цепочке и изменить ссылку «POS-ADDR» на быть в XDocument.Descendants («POS-ADDR»), в этот момент был обнаружен правильный строительный блок, а затем у меня были только жильцы для данного RiskID, поскольку данный фрагмент был очень маленьким фрагментом XML-ответа. Спасибо Tons! !!! –

+0

Есть причина, по которой я использовал 'Elements()' вместо 'Descendants()'. Я думаю, что лучше указать, где именно в документе искать. Это не только эффективнее, но и яснее что именно происходит. Если у вас есть только корневой элемент, вы можете использовать цепочку вызовов для 'Element()'. – svick