#javascript #xml #mirth
#javascript #xml #mirth
Вопрос:
Я использую mirth connect 3.7, java версии 1.8. я новичок как в mirth, так и в javascript. Я настроил канал назначения для javascript writer для получения данных из XML-файлов, вставленных в базу данных mysql. пример раздела xml-файла следующим образом: …
<DG1>
<DG1.1>
<DG1.1.1>1</DG1.1.1>
</DG1.1>
<DG1.2>
<DG1.2.1>I10</DG1.2.1>
</DG1.2>
<DG1.3>
<DG1.3.1>R10.9</DG1.3.1>
</DG1.3>
<DG1.4>
<DG1.4.1>UNSPECIFIED ABDOMINAL PAIN</DG1.4.1>
</DG1.4>
<DG1.5/>
<DG1.6>
<DG1.6.1>A</DG1.6.1>
</DG1.6>
<DG1.7/>
<DG1.8>
<DG1.8.1>391</DG1.8.1>
</DG1.8>
<DG1.9/>
<DG1.10/>
<DG1.11>
<DG1.11.1>4252.21</DG1.11.1>
</DG1.11>
<DG1.12/>
<DG1.13/>
<DG1.14/>
<DG1.15/>
<DG1.16/>
<DG1.17/>
<DG1.18>
<DG1.18.1>N</DG1.18.1>
</DG1.18>
</DG1>
<DG1>
<DG1.1>
<DG1.1.1>2</DG1.1.1>
</DG1.1>
<DG1.2>
<DG1.2.1>I10</DG1.2.1>
</DG1.2>
<DG1.3>
<DG1.3.1>R10.9</DG1.3.1>
</DG1.3>
<DG1.4>
<DG1.4.1>UNSPECIFIED ABDOMINAL PAIN</DG1.4.1>
</DG1.4>
<DG1.5/>
<DG1.6>
<DG1.6.1>A</DG1.6.1>
</DG1.6>
<DG1.7/>
<DG1.8>
<DG1.8.1>391</DG1.8.1>
</DG1.8>
<DG1.9/>
<DG1.10/>
<DG1.11>
<DG1.11.1>4252.21</DG1.11.1>
</DG1.11>
<DG1.12/>
<DG1.13/>
<DG1.14/>
<DG1.15/>
<DG1.16/>
<DG1.17/>
<DG1.18>
<DG1.18.1>N</DG1.18.1>
</DG1.18>
</DG1>
…
Я пытаюсь получить точки данных из xml итеративно, чтобы я мог вставить эти диагностические коды в таблицу mysql. мой сценарий на данный момент:
try {
var dbConn = DatabaseConnectionFactory.createDatabaseConnection ('com.mysql.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3306/adt', 'xxx', 'xxx');
var xml = new XML(connectorMessage.getEncodedData());
var myNodeList = xml.querySelectorAll("DG1");
for (i = 0; i < myNodelist.length; i ) {
var myQuery = 'INSERT INTO adt.diagnosis (AcctNum, MRN, ICD10) VALUES ("' $('AcctNum') '", "' $('MedRecNum') '", "' myNodelist[i]['DG1.3']['DG1.3.1'] '")';
//do something with myVar to get a query...
dbConn.executeUpdate(myQuery);
}
} catch (ex) {
//handle any exceptions...
}
он выполняется без исключений, но я, очевидно, не собираю предназначенные данные. Опять же, новичок в javascript, mirth и синтаксическом анализе xml. Вопросы:
- очевидно, что я неправильно ссылаюсь на точки данных, какова номенклатура в javascript?
- есть ли в mirth среда разработки, в которой я могу пошагово выполнить код и лучше устранить неполадки?
- есть ли какие-либо хорошие рекомендуемые ресурсы для javascript и xml, поскольку это относится к mirth?
Ответ №1:
Mirth использует Mozilla Rhino для своего движка Javascript. Rhino использует устаревший стандарт под названием e4x для обработки XML. Если вы выполните поиск в Google по e4x, вы найдете несколько страниц по адресу developer.mozilla.org со страшными «устаревшими» баннерами повсюду, которые могут быть полезны. Руководство пользователя mirth очень подробное, когда речь заходит о рабочем процессе в mirth.
https://github.com/mozilla/rhino
https://web.archive.org/web/20181120184304/https://wso2.com/project/mashup/0.2/docs/e4xquickstart.html (еще один хороший ресурс e4x)
https://www.nextgen.com/products-and-services/NextGen-Connect-Integration-Engine-Downloads (для руководства пользователя)
Я удивлен, что querySelectorAll не выдал ошибку. С минимальными изменениями в вашем коде:
try {
var dbConn = DatabaseConnectionFactory.createDatabaseConnection ('com.mysql.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3306/adt', 'xxx', 'xxx');
var xml = new XML(connectorMessage.getEncodedData());
// This should work, but is not typically how hl7 segments are accessed. Would need to see more than a segment for typical usage.
var myNodeList = xml.descendants("DG1"); // returns type XMLList
// length is a function instead of property on XMLList objects
for (i = 0; i < myNodelist.length(); i ) {
var myQuery = 'INSERT INTO adt.diagnosis (AcctNum, MRN, ICD10) VALUES ("' $('AcctNum') '", "' $('MedRecNum') '", "' myNodelist[i]['DG1.3']['DG1.3.1'] '")';
dbConn.executeUpdate(myQuery);
}
} catch (ex) {
//handle any exceptions...
}
Используя цикл for each и параметризованный оператор sql:
try {
var dbConn = DatabaseConnectionFactory.createDatabaseConnection ('com.mysql.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3306/adt', 'xxx', 'xxx');
var xml = new XML(connectorMessage.getEncodedData());
var myQuery = 'INSERT INTO adt.diagnosis (AcctNum, MRN, ICD10) VALUES (?, ?, ?)';
for each (var dg1 in xml.descendants('DG1')) {
dbConn.executeUpdate(myQuery, new java.util.ArrayList([$('AcctNum'), $('MedRecNum'), dg1['DG1.3']['DG1.3.1'].toString()]));
}
} catch (ex) {
//handle any exceptions...
}
Вам понадобится finally
блок после вашего try
закрытия подключения к базе данных. Если вы удалите catch
блок, mirth автоматически установит статус сообщения в ERROR, запишет исключение в журнал сервера и запустит событие, на которое вы можете отреагировать с помощью определенного предупреждения. Обычно это проще, чем пытаться обработать исключение самостоятельно.
Ответ №2:
Привет, это не совсем правильно.
Сначала убедитесь, что ваш тип данных — HL7.
Затем сделайте это (это для страховки, но вы поняли идею)
for each ( in1 in msg['IN1']) {
var effdate = in1['IN1.12']['IN1.12.1'];
// etc
}
Комментарии:
1. при выполнении этого я получаю ошибку «ReferenceError: «сообщение»не определено». изучая это, я вижу, что ссылка на сообщение «msg» недоступна за пределами фильтров и преобразователей. итак, я настроил шаг в transformer для сопоставления переменной msg с msg, чтобы она была доступна в целевом javascript. затем: var msg = channelMap.get(‘сообщение’); для каждого (dg1 в сообщении[‘DG1’]) { var icd10 = dg1[‘DG1.3’][‘DG1.3.1’]; var myQuery = ‘ВСТАВИТЬ В adt.diagnosis (AcctNum, MRN, ICD10) ЗНАЧЕНИЯ («‘ $(‘AcctNum’) ‘», «‘ $(‘ MedRecNum’) ‘», «‘ $(‘ icd10’) ‘»)’; DBConn.executeUpdate(myQuery); } .
2. после запуска ошибок нет, но, похоже, он не входит в цикл, т. Е. Не находит никакого ‘DG1’ в сообщении (подтверждено, что они есть). кажется, что должен быть способ ссылаться на сообщение в целевом скрипте, отличный от настройки карты в transformer?
3.
msg
в transformer это просто ссылка на десериализованный необработанный контент после прохождения через тип входящих данных. Если ваш тип данных JSON, тоmsg
результатом будетJSON.parse()
. Если тип данных Raw, тоmsg
это будет строка. В противном случае все другие типы данных сначала преобразуются в строку xml, а затемmsg
является объектом, возвращаемымnew XML()
.