如何有效地测试和解析XML中的深层值?

时间:2012-03-14 21:41:30

标签: xml coldfusion

我正在使用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;
        }
}
}

1 个答案:

答案 0 :(得分:2)

好吧,我不明白为什么你一遍又一遍地调用xmlParse。您可以使用它将字符串转换为XML节点集,但您已经拥有XML节点集。

您可以为所需的节点使用更具体的XPath规范。也许像//*[ local-name() = 'OnlineBoothInformation' ]/CustomFields/Field[@Name="New Exhibitor"]这样的东西。然后你可以检查是否返回了一个空数组。 XPath 真的表达,但它需要一些习惯。请注意,虽然CF通常不区分大小写,但XPath是。我从您的CF复制了案例,但这必须与XML中的案例相匹配才能发挥作用。