LINQ XML запрос по атрибуту и ​​вложенному элементу - PullRequest
1 голос
/ 03 апреля 2020

Я новичок в LINQ и пытаюсь запросить файл XML по атрибуту и ​​значению элемента-потомка.

Вот фрагмент моего XML:

<redirurl>
    <exceptionList state="FL">
        <exception>
            <plancode>ZZ</plancode>
            <url>https://zzzz.com</url>
        </exception>
    </exceptionList>    
    <exceptionList state="NC">
        <exception>
            <plancode>AA</plancode>
            <url>https://aaaa.com</url>
        </exception>
        <exception>
            <plancode>BB</plancode>
            <url>https://bbbb.com</url>
        </exception>
    </exceptionList>
</redirurl>

Я пытаюсь получить значение для URL по штатам и планам. Например, если атрибут состояния exceptionList = "N C" и plancode = "BB", я хочу получить URL-адрес "https://bbbb.com".

Вот мой код:

var xmlFilePath = "myFilePathHere";
XElement xelement = XElement.Load(xmlFilePath );

IEnumerable<XElement> urlAddress = from el in xelement.Elements("exceptionList")
                                   where (string)el.Attribute("state") == "NC"
                                   && (string)el.Element("exception").Element("plancode") == "BB"
                                   select el;

Я не могу правильно ответить на вопрос, чтобы спасти мою жизнь. Если я опущу третью строку запроса (строка плана), я получу в результате весь узел exceptionList. Я полагаю, что смогу пройти через него, чтобы получить план-код, но это не похоже на то, что нужно делать. Запрос как есть не возвращает результаты. Я потратил около 10 часов на это, делая уроки и просматривая примеры кода, но я просто не понимаю. Может кто-нибудь посоветовать, чего мне не хватает? Заранее спасибо.

1 Ответ

1 голос
/ 03 апреля 2020

Вот последовательность Linq, которая делает, как вы просите:

XDocument doc = XDocument.Parse("<redirurl><exceptionList state=\"FL\"><exception><plancode>ZZ</plancode><url>https:////zzzz.com</url></exception></exceptionList><exceptionList state=\"NC\"><exception><plancode>AA</plancode><url>https:////aaaa.com</url></exception><exception><plancode>BB</plancode><url>https:////bbbb.com</url></exception></exceptionList></redirurl>");

            var urlIWant = doc.Root.Descendants("exceptionList").Where(x => x.Attribute("state").Value == "NC").FirstOrDefault()
                .Descendants("exception").Where(z => z.Descendants("plancode").FirstOrDefault().Value == "BB")
                    .FirstOrDefault().Descendants("url").FirstOrDefault().Value;
...