Как отредактировать файл xml?

Работая с документами, вы можете встретить файл с расширением XML. Обычно в Windows данное расширение файла не привязано к программе и поэтому открыть XML файл двойным кликом не получится. В данной статье мы расскажем о том, что это за файл, для чего он может использоваться и чем его открыть.

Что такое XML файл

Перед тем, как приступать к открытию XML файлов, несколько слов о том, что это за файлы и для чего они используются. XML файл – это текстовый файл, построенный с использованием языка разметки XML или eXtensible Markup Language. Данная разметка была разработана для создания документов, которые было бы не сложно обрабатывать программным путем, а также было просто читать человеку без использования специальных программ. Это свойство позволяет открывать и редактировать XML файлы с помощью практически любого текстового редактора.

Язык XML – это набор простых правил, которым должен следовать файл для того, чтобы соответствовать формату. При этом XML не фиксирует разметку, которая используется в документе, позволяя ее определять разработчику программы. Благодаря этому каждый разработчик может создать собственную разметку для решения своих задач и использовать ее в своих XML документах. Это открывает большие возможности по созданию новых форматов файлов на основе XML.

Сейчас язык разметки XML используется в множестве других форматов файлов. Например, известные всем пользователям офисного пакета Microsoft Office форматы DOCX, XLSX и PPTX хранят текстовую информацию в виде XML. Другой пример – популярный формат электронных книг FB2, который также построен на основе XML.

Чем открывать файлы

Как мы уже сказали, XML файл можно открыть с использованием любого текстового редактора. Например, можно использовать стандартный текстовый редактор Блокнот, который есть во всех версиях операционной системы Windows. Просто запустите Блокнот, воспользуйтесь меню «Файл – Открыть», выберите все типы файлов и откройте ваш XML файл. Также вы можете просто перетащить XML файл в окно программы Блокнот.

После этого вы увидите содержимое XML файла в программе «Блокнот». При необходимости вы даже можете его отредактировать и сохранить файл.

Если возможностей стандартного Блокнота вам недостаточно, то можете воспользоваться бесплатной программой Notepad++ (). Данная программа является специализированным текстовым редактором для программистов и веб-мастеров. Главным преимуществом Notepad++ перед простым Блокнотом является подсветка синтаксиса, которая значительно упрощает работу с XML файлами.

Также вы можете открыть XML файл с помощью любого веб-браузера (Google Chrome, Mozilla Firefox, Opera и другие). Для этого просто перетащите файл в окно браузера, и он автоматически откроется. Веб-браузеры умеют подсвечивать синтаксис XML, что значительно упрощает чтение файла, но отредактировать XML файл при помощи браузера уже не удастся.

В некоторых случаях для просмотра содержимого XML файла удобно использовать табличный процессор Excel. Для этого откройте Excel, воспользуйтесь меню «Файл – Открыть» и выберите XML файл. После этого появится небольшое окно в котором нужно выбрать «XML-таблица» и нажать «ОК».

В результате содержимое XML файла будет конвертировано в таблицу Excel, а столбцам будут даны соответствующие названия.

Дальше с содержимым XML файла можно работать как с обычной таблицей Excel.

Как редактировать XML файлы

Как и любой текстовый файл, XML файл можно открыть и отредактировать в любом текстовом редакторе. Но, в большинстве случаев редактировать XML в обычных редакторах очень неудобно. Для решения этой задачи есть специализированные программы, которые обладают подсветкой, подсказками и другими облегчающими работу инструментами. Вот некоторые из таких программ:

  • XML Notepad
  • XML Marker
  • XmlPad
  • Xsemmel
  • XMLSpear
  • Free Xml Formatter
  • XDoc
  • EditiX XML Editor (платная программа, пробный период 30 дней);
  • Altova XMLSpy (платная программа, пробный период 30 дней);
  • Oxygen XML Editor (платная программа, есть пробный период);

Есть и онлайн-редакторы, которые позволяют открыть XML-файл прямо в браузере, редактировать его и сохранять:

Редактирование XML

Данные, хранящиеся в XML файле, можно редактировать прямо в клиентском браузере.

Открытие, редактирование и сохранение XML

В этой главе будет показано как открывать, редактировать и сохранять XML файл, хранящийся на сервере.

Для этого мы будем использовать XSL, чтобы преобразовать XML документ в HTML форму. Значения XML элементов будут записываться в поля ввода в HTML форме. HTML форму можно будет редактировать. После редактирования данные можно будет отправить на сервер, и XML файл будет обновлен (мы покажем соответствующий код на PHP и ASP).

XML и XSL файлы

Для примера возьмем следующий XML документ («tool.xml»):

<?xml version=»1.0″ encoding=»UTF-8″?> <tool> <field id=»prodName»> <value>HAMMER HG2606</value> </field> <field id=»prodNo»> <value>32456240</value> </field> <field id=»price»> <value>$30.00</value> </field> </tool>

И соответствующую таблицу стилей XSL («tool.xsl»):

<?xml version=»1.0″ encoding=»UTF-8″?> <xsl:stylesheet version=»1.0″ xmlns:xsl=»http://www.w3.org/1999/XSL/Transform»> <xsl:template match=»/»> <html> <body> <form method=»post» action=»//msiter.ru/edittool.php»> <h2>Tool Information (edit):</h2> <table border=»0″> <xsl:for-each select=»tool/field»> <tr> <td><xsl:value-of select=»@id»/></td> <td> <input type=»text»> <xsl:attribute name=»id»> <xsl:value-of select=»@id» /> </xsl:attribute> <xsl:attribute name=»name»> <xsl:value-of select=»@id» /> </xsl:attribute> <xsl:attribute name=»value»> <xsl:value-of select=»value» /> </xsl:attribute> </input> </td> </tr> </xsl:for-each> </table> <br /> <input type=»submit» id=»btn_sub» name=»btn_sub» value=»Submit» /> <input type=»reset» id=»btn_res» name=»btn_res» value=»Reset» /> </form> </body> </html> </xsl:template> </xsl:stylesheet>

Код в приведенном выше XSL файле в цикле проходит по элементам XML файла и создает поле ввода для каждого XML элемента-«поля».

Значение атрибута «id» XML элемента-«поля» добавляется одновременно в атрибуты «id» и «name» каждого HTML поля ввода. Значение каждого XML элемента «value» добавляется в атрибут «value» каждого HTML поля ввода. В результате мы получаем редактируемую HTML форму, содержащую значения из XML файла.

Наконец, мы определяем вторую таблицу стилей XSL: «tool_updated.xsl». Этот XSL файл будет использоваться для отображения обновленных XML данных. Данная таблица стилей формирует не HTML форму, а статическую HTML таблицу:

<?xml version=»1.0″ encoding=»UTF-8″?> <xsl:stylesheet version=»1.0″ xmlns:xsl=»http://www.w3.org/1999/XSL/Transform»> <xsl:template match=»/»> <html> <body> <h2>Updated Tool Information:</h2> <table border=»1″> <xsl:for-each select=»tool/field»> <tr> <td><xsl:value-of select=»@id» /></td> <td><xsl:value-of select=»value» /></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>

PHP файл

В файле «tool.xsl» указываем в атрибуте action формы файл «edittool.php».

Файл «edittool.php» содержит две функции: функция loadFile() загружает и преобразовывает XML файл для дальнейшего отображения, а функция updateFile() применяет сделанные изменения в XML файле:

<?php function loadFile($xml, $xsl) { $xmlDoc = new DOMDocument(); $xmlDoc->load($xml); $xslDoc = new DOMDocument(); $xslDoc->load($xsl); $proc = new XSLTProcessor(); $proc->importStyleSheet($xslDoc); echo $proc->transformToXML($xmlDoc); } function updateFile($xml) { $xmlLoad = simplexml_load_file($xml); $postKeys = array_keys($_POST); foreach($xmlLoad->children() as $x) { foreach($_POST as $key=>$value) { if($key == $x->attributes()) { $x->value = $value; } } } $xmlLoad->asXML($xml); loadFile($xml,»tool_updated.xsl»); } if($_POST == «») { loadFile(«tool.xml», «tool.xsl»); } else { updateFile(«tool.xml»); } ?>

Примечание: Все преобразования и изменения XML файла делаются на сервере. Это кросс-браузерное решение. Пользователь получит только HTML страницу, что будет работать в любом браузере.

ASP файл

В файле «tool.xsl» указываем в атрибуте action формы файл «edittool.asp».

Файл «edittool.asp» содержит две функции: функция loadFile() загружает и преобразовывает XML файл для дальнейшего отображения, а функция updateFile() применяет сделанные изменения в XML файле:

<% function loadFile(xmlfile,xslfile) Dim xmlDoc,xslDoc ‘Загружаем XML и XSL файлы set xmlDoc = Server.CreateObject(«Microsoft.XMLDOM») xmlDoc.async = false xmlDoc.load(xmlfile) set xslDoc = Server.CreateObject(«Microsoft.XMLDOM») xslDoc.async = false xslDoc.load(xslfile) ‘Преобразовываем файл Response.Write(xmlDoc.transformNode(xslDoc)) end function function updateFile(xmlfile) Dim xmlDoc,rootEl,f Dim i ‘Загружаем XML файл set xmlDoc = Server.CreateObject(«Microsoft.XMLDOM») xmlDoc.async = false xmlDoc.load(xmlfile) ‘Устанавливаем переменную rootEl равную корневому элементу Set rootEl = xmlDoc.documentElement ‘Цикл по набору формы for i = 1 To Request.Form.Count ‘Убираем элементы кнопок в форме if instr(1,Request.Form.Key(i),»btn_»)=0 then ‘Метод selectSingleNode запрашивает XML файл на наличие одиночного узла, ‘соответствующего запросу. Данный запрос ищет элемент value, который ‘является потомком элемента field, у которого атрибут id соответствует ‘текущему ключу в Form Collection. Когда соответствие будет найдено, ‘установить свойство text равным значению текущего поля в Form Collection. set f = rootEl.selectSingleNode(«field/value») f.Text = Request.Form(i) end if next ‘Сохранить модифицированный XML файл xmlDoc.save xmlfile ‘Освобождаем все ссылки на объекты set xmlDoc=nothing set rootEl=nothing set f=nothing ‘Загружаем модифицированный XML файл с таблицей стилей, ‘которая позволит пользователю увидеть отредактированную информацию loadFile xmlfile,server.MapPath(«tool_updated.xsl») end function ‘Если форма была отправлена, обновить XML файл и отобразить результат ‘Если нет, преобразовать XML файл для редактирования if Request.Form(«btn_sub»)=»» then loadFile server.MapPath(«tool.xml»),server.MapPath(«tool.xsl») else updateFile server.MapPath(«tool.xml») end if %>

Внесение изменений в XML файл средствами DOM XML

Внесение изменений в существующий XML файл с помощью библиотеки DOM XML. Будут рассмотрены следующие основные операции:

  1. Добавление нового элемента.
  2. Обновление значения атрибута существующего элемента.
  3. Обновление значение элемента.
  4. Удаление существующего элемента.

XML файл

Допустим, что у нас есть исходный XML файл.

<?xml version=»1.0″ encoding=»UTF-8″ standalone=»no»?> <company> <staff id=»1″> <firstname>Иван</firstname> <lastname>Иванов</lastname> <nickname>ivanov</nickname> <salary>100000</salary> </staff> </company>

Изменения, которые мы внесем в исходный XML файл:

  1. Изменим идентификационный номер сотрудника (атрибут id=2).
  2. В 2 раза повысим зарплату сотруднику (значение элемента salary=200000).
  3. Добавим информацию о возрасте сотрудника (добавим элемент age=28).
  4. Удалим имя сотрудника (удалим элемент firstname).

Таким образом, после применения всех изменений мы получим XML файл следующего содержания:

<?xml version=»1.0″ encoding=»UTF-8″ standalone=»no»?> <company> <staff id=»2″> <lastname>Иванов</lastname> <nickname>ivanov</nickname> <salary>200000</salary> <age>28</age> </staff> </company>

Изменение файла с помощью DOM XML

package ru.j4web.examples.java.xml; import java.io.File; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class ModifyXMLFileDOMExample { private static final String FILENAME = «staff.xml»; public static void main(String args) { try { // Строим объектную модель исходного XML файла final String filepath = System.getProperty(«user.dir») + File.separator + FILENAME; final File xmlFile = new File(filepath); DocumentBuilder db = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); Document doc = db.parse(xmlFile); doc.normalize(); // Получаем корневой элемент Node company = doc.getFirstChild(); // Получаем элемент сотрудника. Можно сделать это с помощью // метода getFirstChild(), так как мы точно знаем структуру // файла. Однако, лучше использовать более надежный метод // getElementsByTagName(). Node staff = doc.getElementsByTagName(«staff»).item(0); // Изменим идентификационный номер сотрудника (атрибут id=2). NamedNodeMap attributes = staff.getAttributes(); Node id = attributes.getNamedItem(«id»); id.setTextContent(«2»); // Добавим информацию о возрасте сотрудника (добавим элемент // age=28). Element age = doc.createElement(«age»); age.setTextContent(«28»); staff.appendChild(age); // 1. В 2 раза повысим зарплату сотруднику (значение элемента // salary=200000). // 2. Удалим имя сотрудника (удалим элемент firstname). // Для этого — пробежимся по всем дочерним элементам. NodeList nodeList = staff.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node nextNode = nodeList.item(i); if (nextNode.getNodeName().equals(«salary»)) { nextNode.setTextContent(«200000»); } if (nextNode.getNodeName().equals(«firstname»)) { staff.removeChild(nextNode); } } // Записываем изменения в XML файл Transformer transformer = TransformerFactory.newInstance() .newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File(filepath)); transformer.transform(source, result); System.out.println(«Изменения сохранены»); } catch (SAXException | IOException | ParserConfigurationException | TransformerConfigurationException ex) { Logger.getLogger(ModifyXMLFileDOMExample.class.getName()) .log(Level.SEVERE, null, ex); } catch (TransformerException ex) { Logger.getLogger(ModifyXMLFileDOMExample.class.getName()) .log(Level.SEVERE, null, ex); } } }

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *