2013-06-04 3 views
0

У меня есть XML-файлы с разметкой что-то вроде этого:Выбор нескольких значений из XML XDocument (VB.NET)

<?xml version="1.0" encoding="ISO-8859-1"?> 
<clients> 
    <client id="00000" name="Donald Duck"> 
     <group id="AAA" name="ClientInfo"> 
      <term id="Sex">Male</term> 
      <term id="Status">In a relationship</term> 
     </group> 
     <group id="BBB" name="ClientTelephoneNumbers"> 
      <term id="Home">0000-0000000</term> 
      <term id="Cell">1111-1111111</term> 
     </group> 
     <group id="CCC" name="WorkingStatus"> 
      <term id="HasAJob">Yes</term> 
      <term id="Where">Somewhere</term> 
     </group> 
    </client> 
    <client id="11111" name="Daisey Duck"> 
     <group id="AAA" name="ClientInfo"> 
      <term id="Sex">Female</term> 
      <term id="Status">In a relationship</term> 
     </group> 
     <group id="BBB" name="ClientTelephoneNumbers"> 
      <term id="Home">2222-2222222</term> 
      <term id="Cell">3333-3333333</term> 
     </group> 
     <group id="CCC" name="WorkingStatus"> 
      <term id="HasAJob">Unknown</term> 
      <term id="Where">Unknown</term> 
     </group> 
    </client> 
</clients> 

Что я хочу сделать, это выбрать только некоторые из этих значений для вывода.

Если у меня есть такой код:

Dim xml As XDocument = Xdocument.Load(ducks.xml) 
For Each Duck As XElement in xml.Descendants("client") 
    Dim Name As String = Duck.Attribute("Name").Value 
Next 

Я получаю имя (ы) уток, но, скажем, я хочу, чтобы получить номер мобильного телефона, номер домашнего телефона и статус, как я могу затем захватить значение из элемента, где атрибут равен чему-то?

В реальном случае идентификаторы группы более сложны, поэтому я бы предпочёл, чтобы мне не приходилось подсчитывать элементы, я бы хотел их выбрать по их элементарным атрибутам. Например:

Dim xml As XDocument = Xdocument.Load(ducks.xml) 
For Each Duck As XElement in xml.Descendants("client") 
    Dim Name As String = Duck.Attribute("Name").Value 
    Dim Cellphone As string = Duck.Element("group WHERE id IS BBB").Element("term WHERE id IS Cell").Value 
    Dim Homephone As string = Duck.Element("group WHERE id IS BBB").Element("term WHERE id IS Home").Value 
Next 

Я пробовал некоторые запросы, но не мог потрогать его. Какие-либо предложения?

Редактировать примечание: Это не мои реальные попытки для запросов или что-то там в Duck.Element («бла-бла-ГДЕ»), это только для описания того, что я хочу ...

ответ

0

Вот пример:

Dim v = From clt In xml.<client> 
     Where [email protected] = "Donald Duck" 
     Select cellPhone = clt...<term>.Where(Function(x) [email protected] = "Cell").Value, 
       homePhone = clt...<term>.Where(Function(x) [email protected] = "Home").Value, 
       status = clt...<term>.Where(Function(x) [email protected] = "Status").Value 

работы для вашего теста:

Dim xml = <clients> 
      <client id="00000" name="Donald Duck"> 
       <group id="AAA" name="ClientInfo"> 
       <term id="Sex">Male</term> 
       <term id="Status">In a relationship</term> 
       </group> 
       <group id="BBB" name="ClientTelephoneNumbers"> 
       <term id="Home">0000-0000000</term> 
       <term id="Cell">1111-1111111</term> 
       </group> 
       <group id="CCC" name="WorkingStatus"> 
       <term id="HasAJob">Yes</term> 
       <term id="Where">Somewhere</term> 
       </group> 
      </client> 
      <client id="11111" name="Daisey Duck"> 
       <group id="AAA" name="ClientInfo"> 
       <term id="Sex">Female</term> 
       <term id="Status">In a relationship</term> 
       </group> 
       <group id="BBB" name="ClientTelephoneNumbers"> 
       <term id="Home">2222-2222222</term> 
       <term id="Cell">3333-3333333</term> 
       </group> 
       <group id="CCC" name="WorkingStatus"> 
       <term id="HasAJob">Unknown</term> 
       <term id="Where">Unknown</term> 
       </group> 
      </client> 
      </clients> 

EDIT: Вы можете проверить, что v находится в отладчике:

enter image description here

+0

Ну, теперь этот материал хранится в "V", я предполагаю? Как я могу распечатать номер сотового телефона? Console.WriteLine (v.?)? – gubbfett

+1

@gubbfett: 'v' - это коллекция объектов - см. Мое редактирование. Потенциально у вас может быть более одного объекта. В текущем примере, конечно, есть только один. Поэтому вы можете просто написать 'Console.WriteLine (v (0) .cellPhone)'. В идеале у вас будет цикл, проходящий через эту коллекцию. – Neolisk

+1

спасибо! :) – gubbfett

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