17.12.2013, 19:13 | #1 |
Программер
|
Изменить атрибут в файле xml.
Добрый день.
Есть xml файд вида: <text> <text2 atribut="value" /> </text> Задача изменить в файле значение value. Есть ли у кого простейший пример кода "открыть, изменить, сохранить файл"? |
|
17.12.2013, 19:43 | #2 |
Участник
|
Вы хотите читать(перебирать узлы) xml?
Или открыть файл просто как текстовый, согласно вашему описанию задачи вам нужно внести лишь одно изменение, тогда проще так Редактирование файла |
|
17.12.2013, 20:43 | #3 |
Программер
|
Нет это не то. Нужно заменить у определенного элемента.
|
|
17.12.2013, 22:00 | #4 |
Administrator
|
Есть 2 способа чтения xml:
- Последовательное чтение через класс XmlReader. Подходит для крупных файлов. - Загрузка всего файла сразу в память и перебор узлов в цикле. Это класс XmlDocument. Соответственно, выбирайте наиболее подходящий Вам способ и смотрите по перекрестным ссылкам или поиском по АОТу примеры в коде.
__________________
Возможно сделать все. Вопрос времени |
|
18.12.2013, 00:15 | #5 |
Читатель
|
Простейший пример кода "открыть, изменить, сохранить файл"
X++: static void Job001(Args _args) { XmlDocument xmlDoc = new XmlDocument(); XmlNode rootNode; XmlNodeList elementNodes; XmlNode elementNode; int elementNodesLength; int i; ; xmlDoc.load("C:\\Users\\user\\Desktop\\Document.xml"); rootNode = xmlDoc.documentElement(); elementNodes = rootNode.selectNodes('descendant-or-self::text/text2'); elementNodesLength = elementNodes.length(); for (i = 0; i < elementNodesLength; i++) { elementNode = elementNodes.item(i); elementNode.attributes().getNamedItem('atribut').value('new value'); } xmlDoc.save("C:\\Users\\user\\Desktop\\New document.xml"); } |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
18.12.2013, 11:40 | #6 |
Дмитрий Ерин
|
А можно вот так (в порядке тренировки навыков работы с XSLT):
X++: static void ResearchXSLT(Args _args) { #define.OldValue("value") #define.NewValue("NewValue") str fileName = "C:\\temp\\1.xml"; str xslt = strFmt('<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">'+ '<xsl:template match="*|@*|text()">'+ '<xsl:copy>'+ '<xsl:apply-templates select="*|@*|text()"/>'+ '</xsl:copy>'+ '</xsl:template>'+ '<xsl:template match="@atribut[.=\'%1\']">' + '<xsl:attribute name="atribut">%2</xsl:attribute> '+ '</xsl:template>'+ '</xsl:stylesheet>', #OldValue, #NewValue); str outXml = ''; System.Xml.XmlReader xslReader; System.Xml.XmlReader xmlReader; System.Xml.XmlTextWriter xmlWriter; System.IO.StringReader stringReader; System.IO.StringWriter stringWriter; System.Xml.Xsl.XslCompiledTransform xslTransform; System.IO.StreamWriter streamWriter; ; new InteropPermission(InteropKind::ClrInterop).assert(); info(xslt); stringReader = new System.IO.StringReader(xslt); xslReader = System.Xml.XmlReader::Create(stringReader); xmlReader = System.Xml.XmlReader::Create(fileName); xslTransform = new System.Xml.Xsl.XslCompiledTransform(); xslTransform.Load(xslReader); stringWriter = new System.IO.StringWriter(); xmlWriter = new System.Xml.XmlTextWriter(stringWriter); xslTransform.Transform(xmlReader, xmlWriter); xmlReader.Close(); xmlWriter.Close(); outXml = stringWriter.ToString(); streamWriter = new System.IO.StreamWriter(fileName); streamWriter.Write(outXml); streamWriter.Close(); CodeAccessPermission::revertAssert(); info(outXml); }
__________________
|
|
21.12.2013, 15:19 | #7 |
Участник
|
В дополнение к примеру b_nosoff выложу свой, возможно, будет полезен
X++: #define.text2('text2') #define.Atribut('atribut') #define.path(@"Your file path") XMLDocument xmlDoc; XmlElement xmlNode; XmlNodeList xmlNodeList; XMLAttribute attribute; ; xmlDoc = XMLDocument::newFile(#path); xmlNodeList = xmlDoc.getElementsByTagName(#text2); for (xmlNode = xmlNodeList.nextNode(); xmlNode != null; xmlNode = xmlNodeList.nextNode()) { attribute = xmlNode.getAttributeNode(#Atribut); if (attribute) { attribute.text('New value'); } } xmlDoc.save(#path); |
|
23.12.2013, 09:32 | #8 |
Участник
|
xmlDoc.load(@"C:\Users\user\Desktop\Document.xml");
Цитата:
elementNodes = rootNode.selectNodes('descendant-or-self::text/text2');
Цитата:
elementNode.attributes().getNamedItem('atribut').value('new value');
|
|
|
За это сообщение автора поблагодарили: b_nosoff (0). |
Теги |
attribute, xml, xmldocument, атрибут |
|
|