Запрос XML с использованием linq и сравнение двух переменных

#vb.net #linq

#vb.net #linq

Вопрос:

Пытаюсь написать select, который позволит мне выбрать определенный элемент office

Вот мой XML

 <?xml version="1.0"> 
<regions>
    <region>
        <office>
            <name>Office One</name>
        </office>

        <office>
            <name>Office Two</name>
        </office>
        <settings>
            <name>Main Regional Name</name>
        </settings>
    </region>
    <region>
        <office>
            <name>Office Three</name>
        </office>

        <office>
            <name>Office Four</name>
        </office>
        <settings>
            <name>Secondary Regional Name</name>
        </settings>
    </region>
 

Вот мой код

     Dim clfWizardXml As XElement
    Dim selectRegion = lstRegions.SelectedItem
    Dim selectOffice = lstOffices.SelectedItem


    Console.WriteLine(selectRegion   " "   selectOffice)


    Dim officeList As IEnumerable(Of XElement) = _
        From region In clfWizardXml.Elements("region"), _
             office In clfWizardXml.Elements("region").Elements("office") _
        Where region.Element("settings").Element("name").Value = selectRegion _
        And office.Element("name").Value = selectOffice
        Select office
 

Я думаю, что моя проблема где-то здесь:
и office.Элемент («имя»).Значение = selectOffice

Спасибо всем за помощь, проблема заключалась в том, что у меня был элемент office на неправильном уровне во втором регионе.

Комментарии:

1. Если все имена офисов уникальны, вам не нужно фильтровать по регионам.

Ответ №1:

Похоже, ваша проблема заключается в том, что clfWizardXml.Elements("region") она ничего не возвращает, поскольку region не находится непосредственно под документом. Вместо этого вам нужно clfWizardXml.Root.Elements("region") , или clfWizardXml.Descendants("region") :

 Dim officeList As IEnumerable(Of XElement) = _
    From region In clfWizardXml.Root.Elements("region"), _
         office In clfWizardXml.Root.Elements("region").Elements("office") _
    Where region.Element("settings").Element("name").Value = selectRegion _
    And office.Element("name").Value = selectOffice
    Select office
 

Кроме того, поскольку VB.NET поддерживает XML-литералы, вы можете сделать его немного приятнее (во всяком случае, для меня, вы можете не согласиться):

 Dim officeList As IEnumerable(Of XElement) =
    From region In clfWizardXml...<region>,
         office In region.<office>
    Where region.<settings>.<name>.Value = selectRegion _
        AndAlso office.<name>.Value = selectOffice
    Select office
 

Комментарии:

1. Я попробовал ваше предложение, но я все еще не могу выбрать какие-либо офисы из второго региона

2. Оказывается, у меня была ошибка во вложенных элементах моего xml.