我正在使用ColdFusion 8。
我正在解析XML文档,需要获取深埋在文档中的单个值。我正在成功地解析文档并获取我需要的值,但似乎必须有更有效的方法来获取相同的数据。
我没有解析过很多XML。是否必须测试密钥的存在,这在解析XML时非常典型,或者我做错了什么?有没有更好的方法来编码呢?
// PARSE THE SOAP RESPONSE
SoapResponse = xmlParse(httpResponse.fileContent);
// PUT THE RESPONSE NODES INTO AN ARRAY
ResponseNodes = xmlSearch(SoapResponse, "//*[ local-name() = 'OnlineBoothInformation' ]");
// LOOP THROUGH THE ARRAY AND GET EACH NODE
for (i = 1; i lte arrayLen(ResponseNodes); i++) {
// CREATE NEW STRUCTURE TO HOLD BOOTH DATA
BoothInfo = structNew();
// TEST FOR CUSTOM FIELDS TO FIND NEW EXHIBITOR
BoothInfo.NewExhibitor = 0; // DEFAULT NEW EXHIBITOR
if (structKeyExists(ResponseNodes[i], "CustomFields")) {
CustomFields = xmlParse(ResponseNodes[i].CustomFields);
for (j = 1; j lte arrayLen(CustomFields); j=j+1) {
if (structKeyExists(ResponseNodes[i].CustomFields[j], "Field")) {
Field = xmlParse(ResponseNodes[i].CustomFields[j].Field);
for (k = 1; k lte arrayLen(Field); k=k+1) {
if (ResponseNodes[i].CustomFields[j].Field[k].XmlAttributes.Name == "New Exhibitor") {
BoothInfo.NewExhibitor = 1;
}
}
}
}
}
}
我正在为BoothInfo结构获取其他值。他们更容易获得。我没有在这个例子中包含它们。
更新
我能够重写代码并更有效地获得我需要的东西。
// NEW EXHIBITOR
BoothInfo.NewExhibitor = 0;
if (structKeyExists(ResponseNodes[i].CustomFields, "Field")) {
Fields = ResponseNodes[i].CustomFields.Field;
for (j = 1; j lte arrayLen(Fields); j++) {
if (Fields[j].XmlAttributes.Name == "New Exhibitor") {
BoothInfo.NewExhibitor = 1;
break;
}
}
}
答案 0 :(得分:2)
好吧,我不明白为什么你一遍又一遍地调用xmlParse。您可以使用它将字符串转换为XML节点集,但您已经拥有XML节点集。
您可以为所需的节点使用更具体的XPath规范。也许像//*[ local-name() = 'OnlineBoothInformation' ]/CustomFields/Field[@Name="New Exhibitor"]
这样的东西。然后你可以检查是否返回了一个空数组。 XPath 真的表达,但它需要一些习惯。请注意,虽然CF通常不区分大小写,但XPath是。我从您的CF复制了案例,但这必须与XML中的案例相匹配才能发挥作用。