我正在尝试运行此脚本来解析XML文档。当我验证js时,我在for-loop之后得到一个missing )。我是编程新手,不知道哪里出错了。我已经在最后发布了整个js文件。谢谢!
var meds = [];
for (var i = docMedActivities.size(); i--; i >= 0) {
var activity = docMedActivities.get(i);
var material = activity.getConsumable().getManufacturedProduct().getManufacturedMaterial();
meds.push({
name: String(material.getName().getText()),
displayName: String(material.getCode().getDisplayName()),
ndc: String(material.getCode().getTranslations().get(0).getCode()),
doseQty: String(activity.getDoseQuantity().getValue()),
effectiveDateTime: String(activity.getEffectiveTimes().get(0).getLow().getValue()), // 20120502000000+0000
code: String(material.getCode().getCode())
});
}下面是整个js文件:
// Load the CCD Document
var doc = org.openhealthtools.mdht.uml.cda.util.CDAUtil.load(new java.io.ByteArrayInputStream(messageObject.getRawData().getBytes("UTF-8")));
// Get CCD Document Sections to be parsed
var docPatientRole = doc.getRecordTargets().get(0).getPatientRole();
var docPatient = docPatientRole.getPatient();
var docPatientName = docPatient.getNames().get(0);
var docPatientAddress = docPatientRole.getAddrs().get(0);
var docMedSection = doc.getMedicationsSection();
var docMedActivities = docMedSection.getMedicationActivities();
// Patient Identity
var patient = {
firstName: String(docPatientName.getGivens().get(0).getText()),
lastName: String(docPatientName.getFamilies().get(0).getText()),
genderCode: String(docPatient.getAdministrativeGenderCode().getCode()),
dateOfBirth: String(docPatient.getBirthTime().getValue()) // YYYYMMDD
};
// Patient Address
var address = {
addressCity: String(docPatientAddress.getCities().get(0).getText()),
addressState: String(docPatientAddress.getStates().get(0).getText()),
addressPostalCode: String(docPatientAddress.getPostalCodes().get(0).getText())
};
// Patient Medication Activities
var meds = [];
for (var i = docMedActivities.size(); i--; i >= 0) {
var activity = docMedActivities.get(i);
var material = activity.getConsumable().getManufacturedProduct().getManufacturedMaterial();
meds.push({
name: String(material.getName().getText()),
displayName: String(material.getCode().getDisplayName()),
ndc: String(material.getCode().getTranslations().get(0).getCode()),
doseQty: String(activity.getDoseQuantity().getValue()),
effectiveDateTime: String(activity.getEffectiveTimes().get(0).getLow().getValue()), // 20120502000000+0000
code: String(material.getCode().getCode())
});
}
// Populate Channel Map, use JSON so logs are readable
channelMap.put('patient', JSON.stringify(patient, null, 2));
channelMap.put('address', JSON.stringify(address, null, 2));
channelMap.put('meds', JSON.stringify(meds, null, 2));</script>
<type>JavaScript</type>
<data class="map">
<entry>
<string>Script</string>
<string>// Load the CCD Document
var doc = org.openhealthtools.mdht.uml.cda.util.CDAUtil.load(new java.io.ByteArrayInputStream(messageObject.getRawData().getBytes("UTF-8")));
// Get CCD Document Sections to be parsed
var docPatientRole = doc.getRecordTargets().get(0).getPatientRole();
var docPatient = docPatientRole.getPatient();
var docPatientName = docPatient.getNames().get(0);
var docPatientAddress = docPatientRole.getAddrs().get(0);
var docMedSection = doc.getMedicationsSection();
var docMedActivities = docMedSection.getMedicationActivities();
// Patient Identity
var patient = {
firstName: String(docPatientName.getGivens().get(0).getText()),
lastName: String(docPatientName.getFamilies().get(0).getText()),
genderCode: String(docPatient.getAdministrativeGenderCode().getCode()),
dateOfBirth: String(docPatient.getBirthTime().getValue()) // YYYYMMDD
};
// Patient Address
var address = {
addressCity: String(docPatientAddress.getCities().get(0).getText()),
addressState: String(docPatientAddress.getStates().get(0).getText()),
addressPostalCode: String(docPatientAddress.getPostalCodes().get(0).getText())
};
// Patient Medication Activities
var meds = [];
for (var i = docMedActivities.size(); i--; i >= 0) {
var activity = docMedActivities.get(i);
var material = activity.getConsumable().getManufacturedProduct().getManufacturedMaterial();
meds.push({
name: String(material.getName().getText()),
displayName: String(material.getCode().getDisplayName()),
ndc: String(material.getCode().getTranslations().get(0).getCode()),
doseQty: String(activity.getDoseQuantity().getValue()),
effectiveDateTime: String(activity.getEffectiveTimes().get(0).getLow().getValue()), // 20120502000000+0000
code: String(material.getCode().getCode())
});
}
// Populate Channel Map, use JSON so logs are readable
channelMap.put('patient', JSON.stringify(patient, null, 2));
channelMap.put('address', JSON.stringify(address, null, 2));
channelMap.put('meds', JSON.stringify(meds, null, 2));发布于 2013-03-26 02:32:32
在JS文件中,需要编写>=而不是>=;后者只有在JS嵌入(X)HTML PCDATA时才有意义。
(错误消息措辞奇怪的原因是验证器将gt解释为标识符,而将i & gt解释为使用the bitwise-AND operator的表达式。因此,当它看到分号时,它认为for-loop报头应该结束。)
编辑补充:此外,虽然您的for-loop将在您进行此更改后工作,但这只是由于一系列奇怪的怪异和巧合。这一点:
for (var i = docMedActivities.size(); i--; i >= 0) {
...
}意思是:
var i = docMedActivities.size();
while (i--) { // note the post-increment: i-- evaluates to i's old value
...
i >= 0; // note that this expression has no side-effects
}这相当于:
var i = docMedActivities.size();
while (i != 0) {
i--;
...
}
i--;恰好做了你想做的事。因此,您的代码碰巧可以正常工作,但不是因为它看起来正确,而且将来的任何微小更改都会以可怕的混乱方式破坏它。
你真正想写的是:
for (var i = docMedActivities.size() - 1; i >= 0; i--) {
...
}( i >= 0在i--之前,初始化表达式中有- 1 )。
发布于 2013-03-26 02:37:21
在脚本中,您不需要转义HTML实体。JS解析器在for语句中检测到3个分号,这是一个太多而无效的分号-需要一个结束括号。
此外,您还将条件与更新代码进行了交换。将其更改为
for (var i = docMedActivities.size(); i>=0; i--)发布于 2013-03-26 02:35:59
问题出在循环的这一部分:i >= 0
在第三个逗号之后,for语句通常结束,这就是为什么需要一个右括号。将>更改为>。>的意思是“大于”,这表明你从某个地方复制了这段代码,但它可能需要在其他地方进行更改。
此外,我非常确定您的for语句的顺序应该是:
for (var i = docMedActivities.size(); i >= 0; i--) {注意,i--应该是语句的第三部分,‘大于’部分应该是第二部分。最后一部分后面的逗号也不是必需的。
由于您是编程新手,我建议您至少看一看this page on for-loops。但是,环顾一下JavaScript的一般介绍会是一个好主意。
希望这能有所帮助。
https://stackoverflow.com/questions/15622141
复制相似问题