3

シンプルな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');を使用してみました 無駄に

他に何か考えはありますか?

4

6 に答える 6

4

私はStructKeyExistsがあなたがこれを変更したいものであることに同意します:

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

これに:

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

チェックしている最後の項目を除くすべてを最初の引数として使用します。

于 2012-08-17T20:21:06.913 に答える
0

を使用しxmlsearchます。

これをテストするために、XMLにさらにいくつか追加しました。

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

元の従業員にはEmpTypeがありますが、2番目の従業員にはありません。

コードは少し冗長ですが、それが機能することを証明したかっただけです。各ノードをループし、ノード内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 ここここについての良い情報があります。

于 2012-08-17T20:31:26.270 に答える
0

これを試して

<cfscript>
   employee.name[1].xmlAttributes["EmpType"]
</cfscript>
于 2012-08-17T19:55:56.427 に答える
0

私はCFSCRIPTを使用してXMLを解析します。

ノードの存在をテストするときは、structKeyExists();を使用する必要があります。これには、スコープと変数の2つのパラメーターが必要です。スコープを引用符で囲むことはできません。変数は引用符で囲む必要があります。

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);
于 2012-08-17T19:56:38.537 に答える
0

これが私の解決策でした:

myEmpType = '';
    try{
    myEmpType = _XMLDoc.employee.name[1].xmlAttributes["EmpType"]; 
} catch (Any e) {
    myEmpType = 'no category';
}
于 2012-08-17T20:04:26.533 に答える
0

私はこれを処理するためにXPathを使用します:

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

上記の式は、属性EmpTypeを持つノードの配列、または見つからない場合は空の配列を返します。したがって、配列が空かどうかを確認できます。ブール値だけが必要な場合は、次のようにxpath文字列を変更できます。

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

この式はxpath関数を使用します。この関数exists()は、属性を持つノードが見つかった場合はtrueを返し、見つからなかった場合はfalseを返します。式全体は、最初の場合のような配列ではなく、trueまたはfalseのいずれかを返します。戻り値のタイプはXmlSearch()、xpath式が返すものに応じて変わります。

于 2012-08-18T02:29:23.030 に答える