четверг, 27 октября 2011 г.

Использование готовых XML редакторов

Всем привет. Иногда случается так, что нам срочно требуется XML редактор для какого-либо модуля разрабатываемой системы. Требования к редактору могут быть разные - от представления XML в виде дерева до простой подсветки синтаксиса. Как реализовать подобный функционал в самые короткие сроки я расскажу ниже.
Итак, как Вы уже догадались, речь пойдет об использовании сторонних компонентов. Точнее я расскажу про 2 таких - Использование XML Notepad и ICSharpCode.AvalonEdit.
Работать будем со следующим Xml файлом
  1. <root>
  2.     <books>
  3.         <book Name="C# programming" Author="Sombody">
  4.         </book>
  5.         <book Name="F# programming" Author="Sombody">
  6.         </book>
  7.     </books>
  8. </root>
Поехали!
XML Notepad 
Этот инструмент позволит нам создать полноценное окно программы XML Notepad и загрузить в него нужный нам файл. Для этого выполним следующие шаги:
1. Скачать бинарник отсюда
2. Мне пришлось установить программу. Впоследствии она нам не понадобится, её можно будет удалить.
3. Зайти в папку программы (у меня это C:\Program Files (x86)\XML Notepad 2007) и забрать оттуда библиотеку Microsoft.XmlNotepad.dll - её мы и будем использовать.
4. Создаём WinForms проект. Добавляем в него только что полученную сборку. Создаём на форме 1 кнопку и вешаем на неё обработчик.
Вот код формы:
  1. using System;
  2. using System.Windows.Forms;
  3. using XmlNotepad;
  4.  
  5. namespace XmlNotepadSample
  6. {
  7.     public partial class Form1 : Form
  8.     {
  9.         public Form1()
  10.         {
  11.             InitializeComponent();
  12.         }
  13.  
  14.         private void button1_Click(object sender, EventArgs e)
  15.         {
  16.             var openFileDialog = new OpenFileDialog();
  17.             var result = openFileDialog.ShowDialog();
  18.             if (result == DialogResult.OK && openFileDialog.CheckFileExists)
  19.             {
  20.                 var form = new FormMain();
  21.                 form.Open(openFileDialog.FileName);
  22.                 form.ShowDialog();
  23.             }
  24.         }
  25.     }
  26. }
Таким образом, когда мы нажимаем на кнопку - появляется окно для выбора файла. Выбираем файл - открывается окно Xml Notepad, где этот файл можно редактировать.
Таким образом, библиотека XML Notepad позволяет легко встроить в вашу программу редактирование Xml файлов.


ICSharpCode.AvalonEdit
Это библиотека из популярной IDE SharpDevelop. Она использует WPF и реализует функционал редактирования с поддержкой intellisense и подсветкой кода. В рамках данной записи я только покажу, как использовать подсветку и не более, так как полное описание этой библиотеки займет много времени.
Итак, вот что мы сделаем:
1. Качаем последнюю версию IDE
2. Открываем любым архиватором. Нам нужна только библиотека ICSharpCode.AvalonEdit.dll
3. Создаём WPF проект. Добавляем в него библиотеку. Также нам понадобится библиотека System.Windows.Forms (это только для моей реализации. Вы можете обойтись и без неё)
4. Я не спец в WPF, так что прошу сильно не пинать. Ниже представлена разметка единственного окна в моём проекте.

  1. <Window x:Class="ICSharpCode.AvalonEditSample.MainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         Title="MainWindow" Height="350" Width="525">
  5.     <Grid>
  6.         <Grid Height="Auto" Width="Auto">
  7.             <Grid.RowDefinitions>
  8.                 <RowDefinition Height="20"></RowDefinition>
  9.                 <RowDefinition Height="Auto"></RowDefinition>
  10.             </Grid.RowDefinitions>
  11.             <Menu Grid.Row="0"
  12.                   Height="23" HorizontalAlignment="Left" Margin="12,0,0,0" Name="menu1" VerticalAlignment="Top" Width="200">
  13.                 <MenuItem Header="Open" Click="MenuItem_Click_1" />
  14.                 <MenuItem Header="Exit" Click="MenuItem_Click" />
  15.             </Menu>
  16.             <avalonEdit:TextEditor Grid.Row="1"
  17.     xmlns:avalonEdit="http://icsharpcode.net/sharpdevelop/avalonedit"
  18.     Name="textEditor"
  19.     FontFamily="Consolas"
  20.     SyntaxHighlighting="XML"
  21.     FontSize="10pt"/>
  22.         </Grid>
  23.     </Grid>
  24. </Window>
Как вы можете видеть, я просто создал меню с 2мя обработчиками и текстовый редактор из нашей сборки. Основная настройка в редакторе SyntaxHighlighting="XML" - указывает какую подсветку использовать. Далее код для моего окошка:
  1. using System.IO;
  2. using System.Windows;
  3. using System.Windows.Forms;
  4.  
  5. namespace ICSharpCode.AvalonEditSample
  6. {
  7.     public partial class MainWindow : Window
  8.     {
  9.         public MainWindow()
  10.         {
  11.             InitializeComponent();
  12.         }
  13.  
  14.         private void MenuItem_Click(object sender, RoutedEventArgs e)
  15.         {
  16.             Close();
  17.         }
  18.  
  19.         private void MenuItem_Click_1(object sender, RoutedEventArgs e)
  20.         {
  21.             var openFileDialog = new OpenFileDialog();
  22.             var result = openFileDialog.ShowDialog();
  23.             if (result == System.Windows.Forms.DialogResult.OK && openFileDialog.CheckFileExists)
  24.             {
  25.                 var text = File.ReadAllText(openFileDialog.FileName);
  26.                 textEditor.Text = text;
  27.             }
  28.         }
  29.     }
  30. }
Как видно, один обработчик для меню просто закрывает приложение, а второй показывает диалог для выбора файла, загружает контент файла и записывает его в наш редактор. После выбора файла вот как будет выглядеть приложение:
Таким образом мы получили редактор Xml с подсветкой кода и на всё это ушло пара минут!
Помимо XML библиотека ICSharpCode.AvalonEdit поддерживает подсветку синтаксиса также для C#, PHP и ещё много чего. Для этого достаточно вскрыть сборку и поглядеть, какие определения синтаксиса там есть.
Также можно использовать собственные определения для подсветки синтаксиса. Если Вас эта библиотека заинтересовала, вот документация и пример использования.

Подводя итоги, хочется заметить, что данный подход к редактированию XML позволяет быстро использовать сторонние компоненты и получить хороший функционал. Всем спасибо.

2 комментария:

  1. Как насчет лицензий к этим продуктам? Они разрешают вот так вот использовать сборки?

    ОтветитьУдалить
  2. XML Notepad распространяется под лицензией
    Microsoft Public License (Ms-PL),
    AvalonEdit
    под GNU LGPL. Обе, насколько я понимаю, позволяют использовать продукты в коммерческих и некоммерческих целях (я не спец по лицензированию, так что подробнее погляди по ссылкам, что я привел)

    ОтветитьУдалить