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(); }
}
Работа с методом 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)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.