Поделиться через


Сопоставление иерархии объектов с XML-данными

Если 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-документе.

См. также