powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# XmlDocument и XmlNode linq
6 сообщений из 6, страница 1 из 1
c# XmlDocument и XmlNode linq
    #39075035
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Подскажите как можно средствами linq получить значения из элементов xml файла

XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <extent>
    <x>555</x>
    <y>666</y>
  </extent>
  <Layer>
    <isVisible>1</isVisible>
    <siShowLables>0</siShowLables>
  </Layer>
</NewDataSet>



Делаю так, но не выходит. Как достучаться до
<x>555</x>
<y>666</y> ?
Код: c#
1.
2.
3.
4.
5.
6.
7.
var xml = new XmlDocument();
xml.LoadXml(XML string);
var xmlList = xml.SelectNodes("/NewDataSet/extent");
if (xmlList != null)
{
      var node = xmlList.Cast<XmlNode>().Select(s => s).ToArray();
}
...
Рейтинг: 0 / 0
c# XmlDocument и XmlNode linq
    #39075072
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,

Код: c#
1.
2.
3.
4.
5.
var xmlList = xml.SelectNodes("/NewDataSet/extent/*");
if (xmlList.Count > 0)
{
    string[] values = xmlList.OfType<XmlElement>().Select(el => el.InnerText).ToArray();
}
...
Рейтинг: 0 / 0
c# XmlDocument и XmlNode linq
    #39075093
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или так:
Код: c#
1.
2.
3.
4.
var xValues = xd.SelectNodes("/NewDataSet/extent/*/text()");
string[] values = null;
if (xValues!=null)
  values = xValues.OfType<XmlText>().Select(xt => xt.Value).ToArray();
...
Рейтинг: 0 / 0
c# XmlDocument и XmlNode linq
    #39075358
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Я не силен в xml

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <extent>
    <x>555</x>
    <y>666</y>
  </extent>
  <Layer>
    <isVisible>1</isVisible>
    <siShowLables>0</siShowLables>
  </Layer>
  <Layer>
    <isVisible>1</isVisible>
    <siShowLables>0</siShowLables>
  </Layer>
  <Layer>
    <isVisible>1</isVisible>
    <siShowLables>0</siShowLables>
  </Layer>
</NewDataSet>



А перебор Layer с помощью linq можно сделать, без использования for?
...
Рейтинг: 0 / 0
c# XmlDocument и XmlNode linq
    #39075394
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел способ

var xmlList = xml.SelectNodes("/NewDataSet/Layer");
if (xmlList != null && xmlList.Count > 0)
{
var values = xmlList.OfType<XmlLinkedNode>()
.Select(s => s.SelectNodes("*"))
.Select(s => s.OfType<XmlElement>().Select(el => el.InnerText).ToArray())
.ToArray();
}
...
Рейтинг: 0 / 0
c# XmlDocument и XmlNode linq
    #39075798
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoНашел способ

var xmlList = xml.SelectNodes("/NewDataSet/Layer");
if (xmlList != null && xmlList.Count > 0)
{
var values = xmlList.OfType<XmlLinkedNode>()
.Select(s => s.SelectNodes("*"))
.Select(s => s.OfType<XmlElement>().Select(el => el.InnerText).ToArray())
.ToArray();
}
И на выходе будет т.н. jagged array (массив массивов, не путать с multidimensional array) - вы точно уверены, что вам это нужно?
С помощь вот такого XPath
Код: xml
1.
/NewDataSet/Layer/*/text()


можно одним Select вытащить все текстовые ноды в один одномерный массив, код аналогичен приведенному мною выше. Или используйте SelectMany, если так уж хочется пройтись по всей иерархии.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# XmlDocument и XmlNode linq
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]