Member 11859517 Ответов: 1

Как получить значение дочерних узлов в Родительском узле perticular XML в C#?


Привет,
Я в XML-файл Folders.xml,
<root>
<Folder name="Planning">
  <subfolder name="Meeting Minuts"/>
  <subfolder name="Weekly Report"/>
  <subfolder name="Monthaly Report"/>
  <subfolder name="Design Image"/>
</Folder>
<Folder name="Engineering">
  <subfolder name="Engineering1"/>
  <subfolder name="Engineering2"/>
  <subfolder name="Engineering3"/>
  <subfolder name="Engineering4"/>
</Folder>
<Folder name="Quality">
  <subfolder name="Quality1"/>
  <subfolder name="Quality2"/>
  <subfolder name="Quality3"/>
  <subfolder name="Quality4"/>
</Folder>
</root>

Строгание, проектирование и качество-это элемент combobox. Когда пользователь выберет combobox в качестве строгания, мне нужно диспалировать все подпапки в планировании, если он выберет качество, то все подпапки должны отображаться,

Как я могу получить подэлемент определенным родителем,

Что я уже пробовал:

вот код для получения родительского элемента.
XDocument myxml = XDocument.Load(@"Xml\Folders.xml");
            string str = string.Empty;
            foreach (XElement level1Element in XElement.Load(@"Xml\Folders.xml").Elements("Folder"))
            {
                str=(level1Element.Attribute("name").Value);
                Folders.Add(str);
            }
            cmb1.ItemsSource = Folders;

1 Ответов

Рейтинг:
0

Maciej Los

Проверить это:

string folder = "Quality";
var subfolders = myxml.Root.Elements("Folder")
		.Where(x=>x.Attribute("name").Value==folder)
		.SelectMany(x=>x.Elements("subfolder")
                                .Select(y=>y.Attribute("name").Value))
		.ToList();

Результат:
Quality1 
Quality2 
Quality3 
Quality4 


Member 11859517

Спасибо Мацей Лос, его орк, как и ожидалось.

Maciej Los

Супер! Поэтому, пожалуйста, примите мой ответ как решение (зеленая кнопка).
Овации
Мацей

Member 11859517

@Maciej Los здесь я вижу какую-то жестко закодированную строку типа "папка", это корневой элемент и "подпапка", могу ли я получить это также с помощью кода?

Maciej Los

Что вы имеете в виду?
Если вы хотите получить все Folder узлы чтобы иметь возможность фильтровать его по имени, вы должны "определить" имя узла...

Member 11859517

по имени, которое я получаю, мы можем получить строку "папка"/"подпапка".

Maciej Los

Да, ты можешь.

.SelectMany(x=>x.Elements("subfolder")
.Select(y=>new {a = string.Concat(folder, @"/", y.Attribute("name").Value)}))
.ToList();

Приведенный выше код должен вернуться:
Качество/Quality1
Качество/Quality2
Качество/Quality3
Качество/Quality4

Member 11859517

спасибо, я имею в виду, что не хочу передавать "папку"/"подпапку" непосредственно путем жесткого кодирования их, вместо этого я получу эти строки в переменной и передам эту переменную, почему потому, что локализация, если какой-то другой язык жесткого кода строки не подходит.

Maciej Los

Да, вы можете использовать переменную вместо жестко закодированной строки.

Member 11859517

Как же так?