XML-узел дочернего элемента или значение атрибута - PullRequest
0 голосов
/ 11 января 2019

У меня есть XML-схема с вложенными XML-элементами, и вот небольшой фрагмент этого

<aa>
    <id extension="xx" root="56" />
    <name>demo</name>
    <telecom use="emer" value="tel:34444" />
</aa>

<bb>
   <value value="12345" />
</bb>
<cc>
   <value value="234567" />
</cc>

Из этого я должен получить значение «name tag» под «aa tag», последний атрибут (tel :) телекоммуникационного тега и значение атрибута «value tag» (которое находится под тегом bb и тэг)

Я попробовал следующий код, но он не получил именно то, что я ожидал.

xDoc.Descendants().Where(x => x.Name.LocalName.Equals("aa")
                              || x.Name.LocalName.Equals("telecom") && 
                              (x.FirstAttribute.Equals("EC")
                               || x.Name.LocalName.Equals("bb")
                               || x.Name.LocalName.Equals("cc"))

Пожалуйста, предоставьте решение этой проблемы.

1 Ответ

0 голосов
/ 11 января 2019

Вам необходимо выбрать подходящего потомка для каждого из ваших значений, а затем, используя правильный запрос linq, вы можете выбрать нужные значения

class Program
{
    public static void Main(string[] args)
    {
        XDocument doc = XDocument.Load(@"Path to your xml file");

        var name = doc.Descendants("organisation").Elements().Where(x => x.Name == "name").Select(x => (string)x).FirstOrDefault();
        var tel = doc.Descendants("organisation").Elements().Where(x => x.Name == "telecom").Select(x => x.Attribute("value").Value).FirstOrDefault();
        var bb_value = doc.Descendants("startdate").Elements().Where(x => x.Name == "value").Select(x => x.Attribute("value").Value).FirstOrDefault();
        var cc_value = doc.Descendants("enddate").Elements().Where(x => x.Name == "value").Select(x => x.Attribute("value").Value).FirstOrDefault();

        Console.WriteLine($"name: {name} \ntel: {tel} \nbb_value: {bb_value} \ncc_value: {cc_value}");
        Console.ReadLine();
    }
}

Выход:

enter image description here

...