powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Работа с XML из c# для перловика
6 сообщений из 6, страница 1 из 1
Работа с XML из c# для перловика
    #38549472
On1yMe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обычно, если я что-то админю, то это линуха или MSSQL. И обычно для задач администрирования хостов у меня есть perl.
Но в этот раз помимо того, что приходится решать задачу на Win, так еще и в итоге нужно собрать .exe для вызова из командной строки. Поскольку для подобных задач в тренде нынче c# (и потому, что мне давно хотелось его пощупать), решать задачу хочу на нем.

Возьмем такой XML:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<Route>
        <Info>
                <Name>Some Test Route</Name>
                <Guid>22345200-abe8-4f60-90c8-0d43c5f6c0f6</Guid>
        </Info>
        <Items>
                <Item>
                        <Name>Item One</Name>
                        <Src>//alpha/folder</Src>
                        <Dst>//beta/folder</Dst>
                </Item>
                <Item>
                        <Name>Item Two</Item>
                        <Src>//zeta/folder</Src>
                        <Dst>//teta/folder</Dst>
                </Item>
        </Items>
</Route>



1. С точки зрения Perl мы можем легко и быстро (спасибо модулям) преобразовать этот XML во внутреннюю структуру данных. Так:
Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
#!/usr/bin/perl

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;

my $xml = "<Route>
        <Info>
                <Name>Some Test Route</Name>
                <Guid>22345200-abe8-4f60-90c8-0d43c5f6c0f6</Guid>
        </Info>
        <Items>
                <Item>
                        <Name>Item One</Name>
                        <Src>//alpha/folder</Src>
                        <Dst>///beta/folder</Dst>
                </Item>
                <Item>
                        <Name>Item Two</Name>
                        <Src>//zeta/folder</Src>
                        <Dst>//teta/folder</Dst>
                </Item>
        </Items>
</Route>";

my $ref = XMLin($xml);

print Dumper($ref);



В итоге в $ref возвращается содержимое XML в виде структуры данных perl (массивы [value0, value1, ..., valueN] и хеши {key1 => value1, ..., keyN => valueN}:

Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
$VAR1 = {
          'Items' => {
                     'Item' => [
                               {
                                 'Dst' => '///beta/folder',
                                 'Src' => '//alpha/folder',
                                 'Name' => 'Item One'
                               },
                               {
                                 'Dst' => '//teta/folder',
                                 'Src' => '//zeta/folder',
                                 'Name' => 'Item Two'
                               }
                             ]
                   },
          'Info' => {
                    'Guid' => '22345200-abe8-4f60-90c8-0d43c5f6c0f6',
                    'Name' => 'Some Test Route'
                  }
        };



2. Если нам нужно значение GUID из XML - это тоже просто:
Код: perl
1.
print $ref->{'Info'}->{'Guid'};



3. Аналогично присвоив $ref->{'Info'}->{'Guid'} нужное значение мы можем поменять значение GUID в XML:
Код: perl
1.
2.
3.
$ref->{'Info'}->{'Guid'} = 'some new guid';

print Dumper($ref);



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
$VAR1 = {
          'Items' => {
                     'Item' => [
                               {
                                 'Dst' => '//beta/folder',
                                 'Src' => '//alpha/folder',
                                 'Name' => 'Item One'
                               },
                               {
                                 'Dst' => '//teta/folder',
                                 'Src' => '//zeta/folder',
                                 'Name' => 'Item Two'
                               }
                             ]
                   },
          'Info' => {
                      'Guid' => 'some new guid',
                      'Name' => 'Some Test Route'
                    }
        };



Вот эти 3 пункта достаточно просты в Perl, но я так не смог найти простой реализации того на c#, прошу помощи у сообщества.
...
Рейтинг: 0 / 0
Работа с XML из c# для перловика
    #38549606
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
using System;
using System.IO;
using System.Text;
using System.Xml;

namespace test
{
  class Program
  {
    static void Main()
    {
      var xd = new XmlDocument();
      xd.LoadXml(@"
        <Route>
                <Info>
                        <Name>Some Test Route</Name>
                        <Guid>22345200-abe8-4f60-90c8-0d43c5f6c0f6</Guid>
                </Info>
                <Items>
                        <Item>
                                <Name>Item One</Name>
                                <Src>//alpha/folder</Src>
                                <Dst>//beta/folder</Dst>
                        </Item>
                        <Item>
                                <Name>Item Two</Name>
                                <Src>//zeta/folder</Src>
                                <Dst>//teta/folder</Dst>
                        </Item>
                </Items>
        </Route>");
      var guid = xd.SelectSingleNode("/Route/Info/Guid/text()") as XmlText;
      Console.WriteLine(guid.Value);
      guid.Value = Guid.NewGuid().ToString();
      var sb = new StringBuilder();
      using (var sw = new StringWriter(sb))
      using (var xw = XmlWriter.Create(sw,
        new XmlWriterSettings
        {
          Indent = true,
          IndentChars = "  ",
          OmitXmlDeclaration = true
        }))
        xd.Save(xw);
      Console.WriteLine(sb.ToString());
      Console.WriteLine("done");
      Console.ReadKey(true);
    }
  }
}


Консольный вывод:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
22345200-abe8-4f60-90c8-0d43c5f6c0f6
<Route>
  <Info>
    <Name>Some Test Route</Name>
    <Guid>0e038b64-a261-4142-aece-207e3e315be6</Guid>
  </Info>
  <Items>
    <Item>
      <Name>Item One</Name>
      <Src>//alpha/folder</Src>
      <Dst>//beta/folder</Dst>
    </Item>
    <Item>
      <Name>Item Two</Name>
      <Src>//zeta/folder</Src>
      <Dst>//teta/folder</Dst>
    </Item>
  </Items>
</Route>
done
...
Рейтинг: 0 / 0
Работа с XML из c# для перловика
    #38549607
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Перл для windows вполне себе тоже существует: http://www.perl.org/get.html#win32
...
Рейтинг: 0 / 0
Работа с XML из c# для перловика
    #38550834
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On1yMe,

в дотнете есть несколько способов работы с xml.

Класс XmlDocument (пример с которым привёл Сон Веры Павловны) - он реализует модель W3C DOM - она должна быть знакома каждому веб-программисту.

Классы XDocument/XElement - великий и ужасный LINQ, о котором, вероятно, слышали все, даже никогда не работавшие с технологиями .NET и вообще MS.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
var xml = XElement.Parse(
@"<Route>
    <Info>
        <Name>Some Test Route</Name>
        <Guid>22345200-abe8-4f60-90c8-0d43c5f6c0f6</Guid>
    </Info>
    <Items>
        <Item>
            <Name>Item One</Name>
            <Src>//alpha/folder</Src>
            <Dst>//beta/folder</Dst>
        </Item>
        <Item>
            <Name>Item Two</Name>
            <Src>//zeta/folder</Src>
            <Dst>//teta/folder</Dst>
        </Item>
    </Items>
</Route>");

var guid = xml.Element("Info").Element("Guid");
Console.WriteLine(guid.Value);

guid.Value = Guid.NewGuid().ToString();
//xml.Save("file.xml");



Также можно работать с набором классов, используя сериализацию-десериализацию. Для приведённого xml напишем следующие классы:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public partial class Route
{
    public Info Info { get; set; }
    public Item[] Items { get; set; }
}

public partial class Info
{
    public string Name { get; set; }
    public Guid Guid { get; set; }
}

public partial class Item
{
    public string Name { get; set; }
    public string Src { get; set; }
    public string Dst { get; set; }
}


Прочитать данные в них можно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
using (var fs = new FileStream("file.xml", FileMode.Open))
{
    var ser = new XmlSerializer(typeof(Route));
    var route = (Route)ser.Deserialize(fs);

    Console.WriteLine(route.Info.Guid);
}


Т. к. C# статически типизированный, то приходится заранее создавать эти классы. В динамике, конечно, проще.

Этот подход удобен тем, что мы получаем строго типизированные классы - это даёт автоподсказки в IDE при вводе кода, избавляет от случайных опечаток в строковых значениях имён узлов и т. п.

Можно не писать классы вручную, а воспользоваться утилитой xsd.exe (входит в состав Visual Studio): скармливаем ей данный xml, получаем схему xsd, далее получаем набор классов (с кучей сгенерированных атрибутов).


Есть и другие способы: потоковый api, классы для использования xslt, загрузка xml в датасеты (если данные представляют табличные данные), использование скомпилированных xpath-выражений...
...
Рейтинг: 0 / 0
Работа с XML из c# для перловика
    #38551496
Фотография Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныP.S. Перл для windows вполне себе тоже существует: http://www.perl.org/get.html#win32
Использую strawberryperl , без проблем поставил XML::LibXML, XML::LibXSLT (даже под х64).

2On1yMe, а почему именно exe фаил, в чем различие запуска из командной строки в linux и windows?
...
Рейтинг: 0 / 0
Работа с XML из c# для перловика
    #38563350
On1yMe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Black,

В большей степени это пожелание заказчика, бо поддерживать код на c# .net сегодня проще, чем на perl, да еще под виндой.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Работа с XML из c# для перловика
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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