0

これは、修正しようとしているエラーと同じエラーを作成する簡単な例です。

<cfscript>
    private xml function getBaseRequest() {
        // Set up the root xml element
        var xmlReturn = XmlNew(true);
        xmlReturn.xmlRoot = xmlElemNew(xmlReturn,'testbase');

        // Attach a child with generic name
        ArrayAppend(xmlReturn['testbase'].XmlChildren,xmlElemNew(xmlReturn,'thisworks'));

            // Add a child to that
            ArrayAppend(xmlReturn['testbase']['thisworks'].XmlChildren,xmlElemNew(xmlReturn,'attachme'));

        // Now attach a child with node name 'XMLFileDefinition'
        ArrayAppend(xmlReturn['testbase'].XmlChildren,xmlElemNew(xmlReturn,'XMLFileDefinition'));

            // And attempt to add a child to that
            // produces error "Element XMLFileDefinition is undefined in a Java object of type class coldfusion.xml.XmlNodeList"
            ArrayAppend(xmlReturn['testbase']['XMLFileDefinition'].XmlChildren,xmlElemNew(xmlReturn,'thisbreaks'));

        return xmlReturn;
    }
</cfscript>

明確にするために、エラーとしてマークされた行の直前にダンプされたときの XML は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<testbase>
    <thisworks>
        <attachme/>
    </thisworks>
    <XMLFileDefinition/>
</testbase>

残念ながら、この XML はサード パーティが提供するスキーマに従って必要とされるため、ColdFusion でより適切に機能する名前にノードの名前を変更することはできません。

更新これは、ノード名の「XML」プレフィックスに関連しているようです。「XML」で始まるノードは、この問題を引き起こすようです。これをどのように回避したかを詳述した回答を追加しましたが、潜在的な落とし穴があるため、誰かがよりエレガントで普遍的なソリューションを考え出すことができることを願っています。

CF/Java のバージョンは次のとおりです。

  • ColdFusion バージョン: 9,0,1,274733
  • Java バージョン: 14.3-b01

更新も試みましたが、これは次のバージョンでも発生します

  • ColdFusion バージョン: 9,0,1,274733 (累積ホットフィックス 2)
  • Java バージョン: 1.7.0_03
4

1 に答える 1

0

さらに調査した結果、この問題は名前が REGEX 'xml.*' に一致する (つまり、xml の文字で始まる) XML ノードにアクセスしようとしたことが原因であると判断しました。これは、Xml.... XmlAttributes/XmlChildren/XmlText などを参照するために使用されるキーに関連していると想定します。

これを修正するために最終的に使用した方法は次のとおりです(切り捨てられた例)

var xmlReturn = XmlNew(true);
var nodeBody = xmlElemNew(xmlReturn,'RootElement');
xmlReturn.xmlRoot = nodeBody;

var nodeXMLDefinition = xmlElemNew(xmlReturn,'XMLFileDefinition');
    ArrayAppend(nodeXMLDefinition.XmlChildren, xmlElemNew(xmlReturn,'SomeChildElement'));
ArrayAppend(nodeBody.XmlChildren,nodeXMLDefinition);
于 2012-04-04T12:20:32.360 に答える