Сопоставление объектной иерархии с XML-даннымиMapping the Object Hierarchy to XML Data

Когда XML-документ находится в памяти, его концептуальным представлением является дерево.When an XML document is in memory, the conceptual representation is a tree. В распоряжении программиста имеется объектная иерархия для доступа к узлам этого дерева.For programming, you have an object hierarchy to access the nodes of the tree. Следующий пример показывает, как XML-содержимое становится узлами.The following example shows you how the XML content becomes nodes.

При считывании XML в модель DOM, его фрагменты преобразуются в узлы, и эти узлы сохраняют дополнительные метаданные о себе, в частности, тип узла и значения.As the XML is read into the XML Document Object Model (DOM), the pieces are translated into nodes, and these nodes retain additional metadata about themselves, such as their node type and values. Тип узла - это его объект и характеристики, определяющие выполняемые действия и свойства, которые можно установить и получить.The node type is its object and is what determines what actions can be performed and what properties can be set or retrieved.

Если имеется следующий простой XML:If you have the following simple XML:

ВводInput

<book>  
    <title>The Handmaid's Tale</title>  
</book>  

Входные данные представлены в памяти следующим деревом узлов с назначенным свойством типа узлов:The input is represented in memory as the following node tree with the assigned node type property:

Пример дерева узловexample node tree
Представление дерева узлов book и titleBook and title node tree representation

Элемент book становится объектом XmlElementtitle, следующий элемент также становится объектом XmlElement, а элемент content становится объектом XmlText.The book element becomes an XmlElement object, the next element, title, also becomes an XmlElement, while the element content becomes an XmlText object. Методы и свойства объекта XmlElement отличаются от методов и свойств, доступных для объекта XmlText.In looking at the XmlElement methods and properties, the methods and properties are different than the methods and properties available on an XmlText object. Поэтому очень важно знать, какой тип узла получает XML, так как тип узла определяет действия, которые можно выполнить.So knowing what node type the XML markup becomes is vital, as its node type determines the actions that can be performed.

В следующих примерах выполняется считывание XML-данных и запись другого текста, в зависимости от типа узла.The following example reads in XML data and writes out different text, depending on the node type. Использование следующего XML-файла items.xml для получения входных данных.Using the following XML data file as input, items.xml:

ВводInput

<?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 и отображает сведения о типах узлов.The following code example reads the items.xml file and displays information for each node type.

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  

Вывод примера содержит сопоставление данных типам узлов.The output from the example reveals the mapping of the data to the node types.

Выходные данные:Output

<?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-данные стали соответствующими типами узлов.Taking the input one line at a time and using the output generated from the code, you can use the following table to analyze what node test generated which lines of output, thereby understanding what XML data became what kind of node type.

ВводInput ВыводOutput Проверка типа узлаNode Type Test
<?xml version="1.0"?><?xml version="1.0"?> <?xml version='1.0'?><?xml version='1.0'?> XmlNodeType.XmlDeclarationXmlNodeType.XmlDeclaration
<!-- Это пример XML-документа --><!-- This is a sample XML document --> <!-- Это пример XML-документа --><!--This is a sample XML document --> XmlNodeType.CommentXmlNodeType.Comment
<!DOCTYPE Items [<!ENTITY number "123">]><!DOCTYPE Items [<!ENTITY number "123">]> <!DOCTYPE Items [<!ENTITY number "123">]><!DOCTYPE Items [<!ENTITY number "123">] XmlNodeType.DocumentTypeXmlNodeType.DocumentType
<Items><Items> <Items><Items> XmlNodeType.ElementXmlNodeType.Element
<Item><Item> <Item><Item> XmlNodeType.ElementXmlNodeType.Element
Проверка с помощью сущности: &number;Test with an entity: &number; Test with an entity: 123Test with an entity: 123 XmlNodeType.TextXmlNodeType.Text
</Item></Item> </Item></Item> XmlNodeType.EndElementXmlNodeType.EndElement
<Item><Item> <Item><Item> XmNodeType.ElementXmNodeType.Element
test with a child elementtest with a child element test with a child elementtest with a child element XmlNodeType.TextXmlNodeType.Text
<more><more> <more><more> XmlNodeType.ElementXmlNodeType.Element
stuffstuff stuffstuff XmlNodeType.TextXmlNodeType.Text
</Item></Item> </Item></Item> XmlNodeType.EndElementXmlNodeType.EndElement
<Item><Item> <Item><Item> XmlNodeType.ElementXmlNodeType.Element
test with a CDATA sectiontest with a CDATA section test with a CDATA sectiontest with a CDATA section XmlTest.TextXmlTest.Text
<![CDATA[<456>]]><![CDATA[<456>]]> <![CDATA[<456>]]><![CDATA[<456>]]> XmlTest.CDATAXmlTest.CDATA
defdef defdef XmlNodeType.TextXmlNodeType.Text
</Item></Item> </Item></Item> XmlNodeType.EndElementXmlNodeType.EndElement
<Item><Item> <Item><Item> XmlNodeType.ElementXmlNodeType.Element
Проверка с помощью сущности char: &#65;Test with a char entity: &#65; Test with a char entity: ATest with a char entity: A XmlNodeType.TextXmlNodeType.Text
</Item></Item> </Item></Item> XmlNodeType.EndElementXmlNodeType.EndElement
<!-- В этом элементе 14 элементов типа char.--><!-- Fourteen chars in this element.--> <-- В этом элементе 14 элементов типа char.--><--Fourteen chars in this element.--> XmlNodeType.CommentXmlNodeType.Comment
<Item><Item> <Item><Item> XmlNodeType.ElementXmlNodeType.Element
1234567890ABCD1234567890ABCD 1234567890ABCD1234567890ABCD XmlNodeType.TextXmlNodeType.Text
</Item></Item> </Item></Item> XmlNodeType.EndElementXmlNodeType.EndElement
</Items></Items> </Items></Items> XmlNodeType.EndElementXmlNodeType.EndElement

Необходимо знать, какой тип узла назначен, так как от типа узла зависят допустимые типы действий и типы свойств, которые можно установить и получить.You must know what node type is assigned, as the node type controls what kinds of actions are valid and what kind of properties you can set and retrieve.

Управление созданием узлов для пробелов при загрузке данных в модель DOM осуществляется флагом PreserveWhitespace.Node creation for white space is controlled when the data is loaded into the DOM by the PreserveWhitespace flag. Дополнительные сведения см. в руководстве по обработке незначимых и значимых пробелов при загрузке модели DOM.For more information, see White Space and Significant White Space Handling when Loading the DOM.

Чтобы добавить новые узлы в модель DOM, воспользуйтесь руководством Вставка узлов в XML-документ.To add new nodes to the DOM, see Inserting Nodes into an XML Document. Чтобы удалить узлы из модели DOM, изучите статью Удаление узлов, содержимого и значений из XML-документа.To remove nodes from the DOM, see Removing Nodes, Content, and Values from an XML Document. Чтобы изменить узлы в модели DOM, см. статью Изменение узлов, содержимого и значений в XML-документе.To modify the content of nodes in the DOM, see Modifying Nodes, Content, and Values in an XML Document.

См. такжеSee also