使用CFSCRIPT获取xml属性

时间:2012-08-17 19:29:02

标签: xml coldfusion xml-parsing

简单XML

<employee> 
    <name EmpType="Regular"> 
        <first>Almanzo</first> 
        <last>Wilder</last> 
    </name> 
</employee>

我正在尝试使用CFSCRIPT来测试是否存在属性“EmpType”

尝试使用isDefined('_ XMLDoc.employee.name [1] .xmlAttributes.EmpType'); 无济于事

尝试使用structkeyexists(_XMLDoc,'employee.name [1] .xmlAttributes.EmpType'); 无济于事

还有其他想法吗?

6 个答案:

答案 0 :(得分:4)

我同意StructKeyExists是您想要改变的:

structkeyexists(_XMLDoc,'employee.name[1].xmlAttributes.EmpType')

对此:

 structkeyexists(_XMLDoc.employee.name[1].xmlAttributes,'EmpType')

除了你要检查的最后一个项目之外,你想要的是第一个参数。

答案 1 :(得分:0)

试试这个

<cfscript>
   employee.name[1].xmlAttributes["EmpType"]
</cfscript>

答案 2 :(得分:0)

我使用CFSCRIPT来解析XML。

当您测试节点是否存在时,您应该使用structKeyExists();这需要两个参数,范围和变量。范围不能用引号括起来。变量必须用引号括起来。

structKeyExists(SCOPE, "Variable");

这可能有点帮助。

// BOOTH NUMBER
BoothInfo.BoothNumber = ResponseNodes[i].BoothNumber.XmlText;
writeOutput("<h3>BoothNumber - #BoothInfo.BoothNumber# </h3>");

// CATEGORIES
if (structKeyExists(ResponseNodes[i].ProductCategories, "Category")) {
    Categories = ResponseNodes[i].ProductCategories.Category;
    CatIDList = "";
    for (j = 1; j lte arrayLen(Categories); j++) {
        CatID = ResponseNodes[i].ProductCategories.Category[j].XmlAttributes.ID;
        CatIDList = listAppend(CatIDList, CatID);
    }
BoothInfo.CatID = CatIDList;
} else {
BoothInfo.CatID = "";
}
writeOutput(BoothInfo.CatID);

答案 3 :(得分:0)

这是我的解决方案:

myEmpType = '';
    try{
    myEmpType = _XMLDoc.employee.name[1].xmlAttributes["EmpType"]; 
} catch (Any e) {
    myEmpType = 'no category';
}

答案 4 :(得分:0)

使用xmlsearch

为了对此进行测试,我在您的XML中添加了更多内容。

<employee> 
<name EmpType="Regular"> 
    <first>Almanzo</first> 
    <last>Wilder</last> 
</name>
<name> 
    <first>Luke</first> 
    <last>Skywalker</last> 
</name> 
</employee>

您会注意到您的原始员工拥有EmpType,但第二个没有。

代码有点冗长,但我只想证明它有效。它循环遍历每个name节点,并检查其中是否有@EmpType个节点。如果是,则转储该XML节点。

names = xmlsearch(testXML,'employee/name');
for(n=1;n<=arraylen(names);n=n+1){
    thisname = names[n];
    hasemptype = xmlsearch(thisname,'@EmpType');
    if(arraylen(hasemptype)==1){
        writedump(thisname);    
    }
}

关于xmlsearch herehere的信息很好。

答案 5 :(得分:0)

我会使用XPath来处理这个问题:

XmlSearch(xmlObject, "//name[@EmpType]")

上面的表达式返回一个具有属性EmpType的节点数组,如果没有找到则返回一个空数组。因此,您可以检查数组是否为空。如果只需要一个布尔值,可以修改xpath字符串,如下所示:

XmlSearch(xmlObject, "exists(//name[@EmpType])")

此表达式使用xpath函数exists(),如果找到具有该属性的任何节点,则返回true;如果没有,则返回false。整个表达式返回true或false,而不是第一种情况下的数组。 XmlSearch()的返回类型根据xpath表达式的返回而变化。