21.12.2020, 23:18 | #1 |
Участник
|
Импорт в Аксапту файла XML электронных лисов нетрудоспособности
Здравствуйте! Все вроде было хорошо, и новый год близко.
Но не тут то было, ФСС без объявления войны выкатил новый формат ЭЛН, который выгружается для работодателей, и уже импортируется в системы. У нас Аксапта 2009, внедрены расчеты с персоналом и кадры. Был пару лет назад разработан импорт ЭЛН из xml файла. Сейчас поменялся формат, начал дорабатывать и столкнулся с какой то очень плохой штукой. Был формат такой, что перед каждым тегом стоял префикс ns1: Аксапта это все хорошо кушала, и все было хорошо. Сейчас ФСС с большей половины тегов убрала префиксы оставила только сами теги. Так вот без префиксов файл не читается. Внимание вопрос! Было ли у кого что-то подобное, при парсинге xml? Может какие то есть другие способы получить данные? Может я неправильно что-то делаю. Почитал форум но ничего для себя не нашел.. Старый XML PHP код:
X++: //Считывание файла xml doc = XmlDocument::newFile(filename); nsmgr = new XmlNamespaceManager(doc.nameTable()); nsMgr.addNamespace('ns1','http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl'); NodeListRow = doc.selectNodes('//ns1:ROW',nsMgr); elementRow = NodeListRow.nextNode(); while (elementRow) { nodeNAME = elementRow.selectSingleNode('ns1:NAME',nsMgr); If (nodeNAME) NAME = nodeNAME.text(); } PHP код:
X++: doc = XmlDocument::newFile(filename); NodeListRow = doc.selectNodes('//responseRow'); elementRow = NodeListRow.nextNode(); while (elementRow) { info(elementRow.selectSingleNode('Name').text()); elementRow = NodeListRow.nextNode(); } |
|
22.12.2020, 01:20 | #2 |
Administrator
|
Добрый день! А читать через класс XmlReader не пробовали? Файл-то аккурат под этот класс сделан. Основное преимущество - не закачивается сразу весь файл и не валидируется XML в целом, т.е. быстрее должен пройти импорт и меньше кушать памяти.
В классе TaxSaxDocumentHandler_AU есть хороший пример X++: void parseFile(str filename) { XmlReader reader; XmlNodeType nodeType; ; reader = XmlTextReader::newFile(filename); while (reader.read()) { nodeType = reader.nodeType(); switch(nodeType) { case XmlNodeType::Element: this.startElement(reader); break; case XmlNodeType::Text: this.characters(reader.value()); break; } } } X++: void startElement(XmlReader reader) { str qName; ; qName = reader.name(); if (qName == 'field') { fieldID = reader.getAttribute2('ID'); } else if (qName != 'value') { fieldID = ''; } tmpData = ''; } https://stackoverflow.com/questions/...der-in-c-sharp И общие сведения о классе (официальная документация Microsoft): https://docs.microsoft.com/ru-ru/dot...tframework-4.8
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 22.12.2020 в 01:48. |
|
|
За это сообщение автора поблагодарили: trud (3), Logger (3), Ace of Database (3), rootx (1). |
22.12.2020, 08:03 | #3 |
Участник
|
Года два назад при разработке первого импорта смотрел в в сторону XmlReader, но что-то тогда не получилось, сейчас детально буду разбирать. Спасибо за примеры. По АОТу тоже уже искал примеры.
|
|
22.12.2020, 08:17 | #4 |
Участник
|
Парзеру xml должно быть все ты равно на префиксы главное чтобы неймспейс был тот же. Прочитайте как устроен xml - про префиксы и неймспесы. Приведите пожалуйста разницу в декларации неймспейсов. https://www.w3schools.com/xml/xml_namespaces.asp
|
|
|
За это сообщение автора поблагодарили: rootx (1). |
22.12.2020, 13:13 | #5 |
Участник
|
Цитата:
А читать через класс XmlReader не пробовали?
|
|