|
Программирование >> Программирование с использованием ajax
Внутри двух блоков if добавляется соответствующий текст к списочному представлению. Вы должны знать тип текущего экземпляра root, потому что информация, которую требуется отобразить, получается по-разному для разных элементов: необходимо отобразить имена XmlElement и значения XmlText. Причина в том, что RecurseXmlDocument вызывается рекурсивно только в том случае, если узел является XmlElement, так как XmlText никогда не имеет дочерних элементов. Изменение значений узлов Прежде чем рассмотреть, как изменяется значение узла, важно понять, что значение узла очень редко бывает простым. Фактически вы столкнетесь с тем, что почти все классы, унаследованные от XmlNode, включают свойство по имени Value, которое редко возвращает что-то полезное. Хотя поначалу это несколько разочаровывает, потом вы обнаружите, что это достаточно логично. Рассмотрим ранее приведенный пример books: <books> <book> <title>Beginning Visual C#</title> <author> Karli Watson</author> <code>7582</code> </book> <book> </books> Каждая отдельная пара дескрипторов разрешается в DOM в виде узла. Вспомните, что когда вы проходили циклом по всем узлам документа, то встречали множество узлов XmlElement и три элемента XmlText. Узлами XmlElement в этом XML являются <books>, <book>, <title>, <author> и <code>. Узлы XmlText представляют собой текст, находящийся между начальным и конечным дескрипторами title, author и code. Хотя можно утверждать, что значениями узлов title, author и code является текст между дескрипторами, этот текст сам по себе является узлом, и как таковой, содержит в себе значение. Другие узлы, очевидно, не имеют никаких ассоциированных с ними значений помимо вложенных узлов. Если вы заглянете в конец кода ранее приведенного метода RecurseXmlDocument, то найдете там следующую строку в блоке if, когда текущим узлом является XmlText: string text = ( (XmlText)root) .Value; Здесь можно видеть, что свойство Value узла XmlText используется для получения значения узла. Узлы типа XmlElement возвращают null, если вы используете свойство Value, но можно получить информацию, находящуюся между начальным и конечным дескрипторами XmlElement, если вы используете один из двух других методов: InnerText и Inner Xml. Это значит, что можно манипулировать значением узлов, используя два метода и свойство, которые описаны в табл. 25.3. Вставка новых узлов Теперь, когда вы увидели, как перемещаться по документу XML и даже получать значения его элементов, давайте рассмотрим, как изменить структуру документа, добавляя узлы к документу books, с которым мы имели дело до сих пор. Чтобы вставлять новые элементы в список, нужно ознакомиться с новыми методами классов XmlDocument и XmlNode, которые перечислены в табл. 25.4. Таблица 25.3. Средства для манипулирования значениями узлов Свойство Описание Inner Text Получает текст всех дочерних по отношению к текущему узлов и возвращает его в виде единственной соединенной строки. Это значит, что если вы получаете значение InnerText ИЗ узла book в предыдущем XML, будет возвращена строка Beginning Visual C#Karli Watson7582. Если ВЫ получите InnerText узла title, будет возвращено только Beginning Visual С#. Вы можете устанавливать текст, используя этот метод, но будьте осторожны, делая это, поскольку если вы установите текст неверного узла, то можете переписать информацию, которую не нужно было бы изменять. innerxml Возвращает текст, как и InnerText, но также возвращает и все дескрип- торы. Таким образом, если вы получите значение innerXml узла book, то результатом будет следующая строка: <title>Beginning Visual C#</title> <author>Karli Watson</author><code>7582</code> Как видите, это может быть довольно удобно, если есть строка, содержащая XML, которую необходимо включить непосредственно в документ XML. Однако в этом случае вы полностью отвечаете за содержимое этой строки, и если вы вставите неправильный XML, то приложение сгенерирует исключение. Value Обеспечивает самый чистый способ манипуляции информацией в доку- менте, но, как упоминалось ранее, только несколько классов в действительности возвращают нечто полезное при получении значения. Классы, возвращающие нужный текст, таковы: XmlText XmlComment XmlAttribute Таблица 25.4. Новые методы классов XmlDocument и XmlNode Метод Описание CreateNode Создает узел любого вида. Существуют три перегрузки этого метода, две из которых позволяют создавать узлы типа из перечисления XmlNodeType, и одна, позволяющая специфицировать тип узла для использования в виде строки. Если только вы не абсолютно уверены в том, что не укажете ошибочно в виде строки тип узла, отсутствующий в перечислении, настоятельно рекомендуется отдавать предпочтение перегрузкам, принимающим аргумент типа перечисления. Метод возвращает экземпляр xmlNode, который может быть явно приведен к соответствующему типу CreateElement Версия CreateNode, создающая только узлы типа XmlDocument CreateAttribute Версия CreateNode, создающая только узлы типа XmlAttribute CreateTextNode Создает узлы типа XmlTextNode CreateComment Этот метод включен здесь для того, чтобы описать типы узлов, которые могут быть созданы. Этот метод не создает узел, являющийся частью данных, представленных документом XML, а создает комментарий, предназначенный для чтения человеком. Можно также извлекать комментарии при чтении документа приложением Класс XmlDocument имеет методы, позволяющие создавать новые экземпляры XmlNode и XmlElement, что замечательно, поскольку оба эти класса имеют только защищенные (protected) конструкторы, а это значит, что вы не можете создать экземпляр каждого из них непосредственно операцией new. Методы, перечисленные в табл. 25.4, используются для создания самих узлов, но после вызова любого из них необходимо что-то с ними сделать, чтобы они представляли хоть какой-нибудь интерес. Немедленно после создания узлы не несут в себе дополнительной информации и не представляют никакой ценности для документа. Чтобы изменить это, вы должны использовать методы, которые находятся в классах-наследниках XmlNode (включая XmlDocument и XmlElement). Эти методы перечислены в табл. 25.5. Таблица 25.5. Методы классов-наследников XjoilNode Метод Описание AppendChiid Добавляет дочерний узел к узлу типа XmiNode или типу-наследнику. Помните, что добавляемый узел появляется в конце списка дочерних узлов того узла, на котором вызван метод. Если порядок дочерних узлов безразличен, то проблемы нет; если же порядок важен, необходимо добавлять узлы в корректной последовательности insertAf ter Контролирует точно место вставки нового узла. Метод принимает два пара- метра: первый - новый узел, и второй - узел, после которого нужно вставить новый. insertBef ore Работает точно так же, как InsertAf ter, за исключением того, что вставля- ет новый узел перед узлом, переданным во втором параметре В следующем практическом занятии представлен пример, построенный на базе предыдущего, который вставляет узел book в документ books.xml. В примере нет кода, очищающего документ (пока), поэтому, запустив его несколько раз, вы получите несколько идентичных узлов. Создание узлов Выполните следующие шаги, чтобы добавить узел в документ books. xml. 1. Добавьте кнопку ниже существующей кнопки в форме и назовите ее buttonCreate Node. 2. Выполните двойной щелчок на новой кнопке и введите следующий код: private void buttonCreateNode Click(object sender, EventArgs e) { Загрузка документа XML. XmlDocument document = new XmlDocument() ; document.Load(@ C:\Beginning Visual C#\Chapter 25\Books.xml ); Получение корневого элемента. XmlElement root = document.DocumentElement; Создание новых узлов. XmlElement newBook = document.CreateElement( book ); XmlElement newTitle = document.CreateElement( title ); XmlElement newAuthor = document.CreateElement( author ); XmlElement newCode = document.CreateElement( code ); XmlText title = document.CreateTextNode( Beginning Visual C# 3rd Edition );
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |