元素XMLFileDefinition在类coldfusion.xml.XmlNodeList类型的Java对象中未定义

时间:2012-04-04 09:03:09

标签: java xml coldfusion

这是一个简化的示例,它会为我要修复的错误创建一个相同的错误。

<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更好地工作的东西。

UPDATE 这似乎与节点名称上的“XML”前缀有关。任何以“XML”为前缀的节点似乎都会导致此问题。我已经添加了我的回答,详细说明了我如何解决这个问题,但希望有人可以提出一个更优雅/通用的解决方案,因为我有一些潜在的陷阱。

CF / Java的版本如下:

  • ColdFusion版本:9,0,1,274733
  • Java版本:14.3-b01

我也尝试过更新,但仍会出现以下版本

  • ColdFusion版本:9,0,1,274733(累积修补程序2)
  • Java版本:1.7.0_03

1 个答案:

答案 0 :(得分:0)

经过进一步调查后,我确定此问题是由于尝试访问名称与REGEX'xml。*'匹配的XML节点(即在任何情况下以字母xml开头)引起的。我无法识别特定的解释虽然我认为这涉及用于引用XmlAttributes / XmlChildren / XmlText等的Xml ....键

我最终用于解决此问题的方法如下(截断示例)

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);