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 回答