Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Если XML-документ находится в памяти, концептуальное представление представляет собой дерево. Для программирования у вас есть иерархия объектов для доступа к узлам дерева. В следующем примере показано, как xml-содержимое становится узлами.
Так как XML считывается в объектную модель XML-документа (DOM), элементы превратятся в узлы, и эти узлы сохраняют дополнительные метаданные о себе, такие как тип узла и значения. Тип узла является его объектом и определяет, какие действия можно выполнить и какие свойства можно задать или извлечь.
Если у вас есть следующий простой XML-код:
Входные данные
<book>
<title>The Handmaid's Tale</title>
</book>
Входные данные представлены в памяти в виде следующего дерева узлов со свойством назначенного типа узла:
Представление дерева узлов книги и заголовка
Элемент book
становится объектом XmlElement , следующим элементом, title
также становится XmlElement, а содержимое элемента становится объектом XmlText . При рассмотрении методов и свойств XmlElement они отличаются от тех, что доступны в объекте XmlText. Таким образом, зная тип узла, разметка XML становится жизненно важной, так как его тип узла определяет действия, которые можно выполнить.
Следующий пример считывает данные XML и записывает другой текст в зависимости от типа узла. Используя следующий XML-файл данных в качестве входных данных, items.xml:
Входные данные
<?xml version="1.0"?>
<!-- This is a sample XML document -->
<!DOCTYPE Items [<!ENTITY number "123">]>
<Items>
<Item>Test with an entity: &number;</Item>
<Item>test with a child element <more/> stuff</Item>
<Item>test with a CDATA section <![CDATA[<456>]]> def</Item>
<Item>Test with a char entity: A</Item>
<!-- Fourteen chars in this element.-->
<Item>1234567890ABCD</Item>
</Items>
В следующем примере кода считывается файл items.xml и отображаются сведения для каждого типа узла.
Imports System
Imports System.IO
Imports System.Xml
Public Class Sample
Private Const filename As String = "items.xml"
Public Shared Sub Main()
Dim reader As XmlTextReader = Nothing
Try
' Load the reader with the data file and
'ignore all white space nodes.
reader = New XmlTextReader(filename)
reader.WhitespaceHandling = WhitespaceHandling.None
' Parse the file and display each of the nodes.
While reader.Read()
Select Case reader.NodeType
Case XmlNodeType.Element
Console.Write("<{0}>", reader.Name)
Case XmlNodeType.Text
Console.Write(reader.Value)
Case XmlNodeType.CDATA
Console.Write("<![CDATA[{0}]]>", reader.Value)
Case XmlNodeType.ProcessingInstruction
Console.Write("<?{0} {1}?>", reader.Name, reader.Value)
Case XmlNodeType.Comment
Console.Write("<!--{0}-->", reader.Value)
Case XmlNodeType.XmlDeclaration
Console.Write("<?xml version='1.0'?>")
Case XmlNodeType.Document
Case XmlNodeType.DocumentType
Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value)
Case XmlNodeType.EntityReference
Console.Write(reader.Name)
Case XmlNodeType.EndElement
Console.Write("</{0}>", reader.Name)
End Select
End While
Finally
If Not (reader Is Nothing) Then
reader.Close()
End If
End Try
End Sub 'Main ' End class
End Class 'Sample
using System;
using System.IO;
using System.Xml;
public class Sample
{
private const String filename = "items.xml";
public static void Main()
{
XmlTextReader reader = null;
try
{
// Load the reader with the data file and ignore
// all white space nodes.
reader = new XmlTextReader(filename);
reader.WhitespaceHandling = WhitespaceHandling.None;
// Parse the file and display each of the nodes.
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
Console.Write("<{0}>", reader.Name);
break;
case XmlNodeType.Text:
Console.Write(reader.Value);
break;
case XmlNodeType.CDATA:
Console.Write("<![CDATA[{0}]]>", reader.Value);
break;
case XmlNodeType.ProcessingInstruction:
Console.Write("<?{0} {1}?>", reader.Name, reader.Value);
break;
case XmlNodeType.Comment:
Console.Write("<!--{0}-->", reader.Value);
break;
case XmlNodeType.XmlDeclaration:
Console.Write("<?xml version='1.0'?>");
break;
case XmlNodeType.Document:
break;
case XmlNodeType.DocumentType:
Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value);
break;
case XmlNodeType.EntityReference:
Console.Write(reader.Name);
break;
case XmlNodeType.EndElement:
Console.Write("</{0}>", reader.Name);
break;
}
}
}
finally
{
if (reader != null)
reader.Close();
}
}
} // End class
Выходные данные из примера показывают сопоставление данных с типами узлов.
Выходные данные
<?xml version='1.0'?><!--This is a sample XML document --><!DOCTYPE Items [<!ENTITY number "123">]<Items><Item>Test with an entity: 123</Item><Item>test with a child element <more> stuff</Item><Item>test with a CDATA section <![CDATA[<456>]]> def</Item><Item>Test with a char entity: A</Item><--Fourteen chars in this element.--><Item>1234567890ABCD</Item></Items>
Принимая одну строку входных данных за раз и используя выходные данные, сформированные кодом, можно воспользоваться следующей таблицей, чтобы проанализировать, какой тест узла породил конкретные строки выходных данных, тем самым понять, какими типами узлов стали XML-данные.
Ввод | Выходные данные | Тест типа узла |
---|---|---|
<?xml version="1.0"?> | <?xml version='1.0'?> | XmlNodeType.XmlDeclaration |
<-- Это пример XML-документа.> | <--This — это пример XML-документа.> | XmlNodeType.Comment |
<! Элементы DOCTYPE [<! Номер сущности "123">]> | <! Элементы DOCTYPE [<! Номер сущности "123">] | XmlNodeType.DocumentType |
<Элементы> | <Элементы> | XmlNodeType.Element |
<Пункт> | <Пункт> | XmlNodeType.Element |
Тестирование с помощью сущности: &number; | Тестирование с помощью сущности: 123 | XmlNodeType.Text |
</Пункт> | </Пункт> | XmlNodeType.EndElement |
<Пункт> | <Пункт> | XmNodeType.Element |
тестирование, включающее дочерний элемент | тестирование, включающее дочерний элемент | XmlNodeType.Text |
<больше> | <больше> | XmlNodeType.Element |
вещи | вещи | XmlNodeType.Text |
</Пункт> | </Пункт> | XmlNodeType.EndElement |
<Пункт> | <Пункт> | XmlNodeType.Element |
тестирование с помощью раздела CDATA | тестирование с помощью раздела CDATA | XmlTest.Text |
<! [CDATA[<456>]]> | <! [CDATA[<456>]]> | XmlTest.CDATA |
def | def | XmlNodeType.Text |
</Пункт> | </Пункт> | XmlNodeType.EndElement |
<Пункт> | <Пункт> | XmlNodeType.Element |
Тестирование с помощью сущности char: A | Тестирование с помощью сущности char: A | XmlNodeType.Text |
</Пункт> | </Пункт> | XmlNodeType.EndElement |
<-- Четырнадцать символов в этом элементе.-> | <--Четырнадцать символов в этом элементе.--> | XmlNodeType.Comment |
<Пункт> | <Пункт> | XmlNodeType.Element |
1234567890ABCD | 1234567890ABCD | XmlNodeType.Text |
</Пункт> | </Пункт> | XmlNodeType.EndElement |
</Элементы> | </Элементы> | XmlNodeType.EndElement |
Необходимо знать, какой тип узла назначен, так как тип узла определяет допустимые типы действий и какие свойства можно задать и извлечь.
Создание узла для пробелов контролируется флагом PreserveWhitespace при загрузке данных в DOM. Дополнительные сведения см. в разделе "Пробелы" и "Значительная обработка пробелов" при загрузке DOM.
Сведения о добавлении новых узлов в DOM см. в разделе "Вставка узлов" в XML-документ. Сведения об удалении узлов из DOM см. в разделе "Удаление узлов, содержимого и значений" из XML-документа. Сведения об изменении содержимого узлов в DOM см. в разделе "Изменение узлов, содержимого и значений" в XML-документе.