ADO.NET. Управление базами данных. Связь по схеме OLE DB провайдера. Коррекция стилей DataGridView, страница 26

             Console.Write(" " + rd.Name + "='" + rd.Value + "'>");

           if (rd.IsEmptyElement == true)

            Console.Write(" <-- EmptyElement ");

           else

             Console.Write(" <-- Element ");

           break;

        case XmlNodeType.Text:

           Console.Write(rd.Value + " <-- Text ");

           break;

        case XmlNodeType.CDATA:

           Console.Write(rd.Value + " <-- CDATA");

           break;

        case XmlNodeType.ProcessingInstruction:

           Console.Write("<?" + rd.Name + " " + rd.Value + "?>" +

             " <-- ProcessingInstruction");

           break;

        case XmlNodeType.Comment:

           Console.Write("<!--" + rd.Value + "--> <-- Comment");

           break;

        case XmlNodeType.XmlDeclaration:

           Console.Write("<?xml " + rd.Value + " ?> <-- XmlDeclaration");

           break;

        case XmlNodeType.Document:

           Console.Write("<?" + rd.Value + "?> <-- Document");

           break;

        case XmlNodeType.Whitespace:

        case XmlNodeType.SignificantWhitespace:

           Console.Write(rd.Value);

           break;

        case XmlNodeType.EndElement:

           Console.Write("</" + rd.Name + "> <-- EndElement ");

           break;

      }

    }

   }

   catch (XmlException ex) { MessageBox.Show(ex.Message); }

   finally { rd.Close(); }

  }

Компонент, отображающий XML-документы

Работа с методом ParseXml натолкнула на мысль о том, что в учебных целях неплохо бы разработать отдельный компонент, который способен отображать XML-документы в удобочитаемом виде, почти так же, как это делает Visual Studio. Напомним, что компонентом называется класс, производный от класса Component. Для отображения XML-документов удобно оттолкнуться от функциональности, предоставляемой классом RichTextBox.

Класс RichTextBox, как и любой другой элемент Windows-форм, происходит от класса Component. Поэтому наш класс XmlRichTextBox, который мы произведем от класса RichTextBox, можно назвать компонентом формы. Он автоматически появится в окне Toolbox студии и с ним можно будет работать в режиме дизайна. В подтверждение сказанного приведем родословную класса RichTextBox. Стрелки, указывающие на базовый класс, как и в реальных родословных, принято направлять на родителей.

RichTextBox®TextBoxBase®Control®Component®MarshalByRefObject®Object

·  Используя контекстное меню проекта выберите команду Add®Class и задайте имя класса XmlRichTextBox.

·  В описание класса добавьте спецификатор public и сделайте класс производным от RichTextBox.

Обратите внимание на изменение значка (иконки) класса в окне Solution Explorer. Таким образом студия помечает компоненты, для того, чтобы их можно было легко отличить от обычных классов. Скопируйте код компонента XmlRichTextBox и восстановите его в файле XmlRichTextBox.cs.

public class XmlRichTextBox : RichTextBox

{

  XmlDocument doc;

  int tagLevel;

  const int indentLen = 15;

  public XmlRichTextBox()

  {

   doc = null;

   int[] tabs = new int[32];

   for (int i = 0; i < tabs.Length; i++)

    tabs[i] = indentLen * i;

   SelectionTabs = tabs;

  }

  ///<summary>Loads XML-document and shows the result of XPath query</summary>

  public void ShowXml(string docPath, string xPath)

  {

   Clear();

   doc = new XmlDocument();

   XmlNodeList nodes = null;

   tagLevel = -1;

   doc.Load(docPath);

   nodes = doc.SelectNodes(xPath);

   foreach (XmlNode node in nodes)

    WriteChildren(node);

   SelectionStart = 0;

  }

  ///<summary>Recursively renders child elements of a given node in XML document</summary>

  void WriteChildren(XmlNode node)

  {

   switch (node.NodeType)

   {

    case XmlNodeType.Document:

    case XmlNodeType.Element:

      tagLevel++;

      StartTag(node);

      foreach (XmlAttribute a in node.Attributes)