AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.12.2013, 19:13   #1  
vasiliy is offline
vasiliy
Программер
 
288 / 17 (1) ++
Регистрация: 21.10.2004
Адрес: E-burg
Изменить атрибут в файле xml.
Добрый день.
Есть xml файд вида:
<text>
<text2 atribut="value" />
</text>

Задача изменить в файле значение value.
Есть ли у кого простейший пример кода "открыть, изменить, сохранить файл"?
Старый 17.12.2013, 19:43   #2  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
306 / 137 (5) +++++
Регистрация: 21.04.2008
Вы хотите читать(перебирать узлы) xml?
Или открыть файл просто как текстовый, согласно вашему описанию задачи вам нужно внести лишь одно изменение, тогда проще так Редактирование файла
Старый 17.12.2013, 20:43   #3  
vasiliy is offline
vasiliy
Программер
 
288 / 17 (1) ++
Регистрация: 21.10.2004
Адрес: E-burg
Нет это не то. Нужно заменить у определенного элемента.
Старый 17.12.2013, 22:00   #4  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,317 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Есть 2 способа чтения xml:
- Последовательное чтение через класс XmlReader. Подходит для крупных файлов.
- Загрузка всего файла сразу в память и перебор узлов в цикле. Это класс XmlDocument.

Соответственно, выбирайте наиболее подходящий Вам способ и смотрите по перекрестным ссылкам или поиском по АОТу примеры в коде.
__________________
Возможно сделать все. Вопрос времени
Старый 18.12.2013, 00:15   #5  
b_nosoff is offline
b_nosoff
Читатель
Аватар для b_nosoff
MCP
MCBMSS
 
197 / 143 (5) +++++
Регистрация: 01.12.2004
Адрес: Msk
Записей в блоге: 13
;) Простейший пример кода "открыть, изменить, сохранить файл"
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");
}
Дальше сами разберетесь?
__________________
Axapta non erubescit
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 18.12.2013, 11:40   #6  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
А можно вот так (в порядке тренировки навыков работы с 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  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
В дополнение к примеру 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  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от b_nosoff Посмотреть сообщение
xmlDoc.load("C:\\Users\\user\\Desktop\\Document.xml");
xmlDoc.load(@"C:\Users\user\Desktop\Document.xml");



Цитата:
elementNodes = rootNode.selectNodes('descendant-or-self::text/text2');
elementNodes = rootNode.selectNodes('//text/text2');

Цитата:
elementNode.attributes().getNamedItem('atribut').value('new value');
elementNode.setAttrinute('attribute', 'new value');
За это сообщение автора поблагодарили: b_nosoff (0).
Теги
attribute, xml, xmldocument, атрибут

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Перевод строки в xml-файле Ivanhoe DAX: Программирование 48 13.02.2012 12:54
kamalblogs: Converting a System.Xml.XmlDocument to XML type in Dynamics ax Blog bot DAX Blogs 0 19.04.2010 09:05
X++: Serializing Axapta Foundation Class instances as XML streams Blog bot DAX Blogs 0 04.06.2009 23:05
PatrickChua: XML serialization Blog bot DAX Blogs 0 04.05.2009 14:05
axStart: How to use XSLT in AIF and what’s wrong with empty xml Nodes. Blog bot DAX Blogs 0 27.04.2008 18:07

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:20.