这是一个简化的示例,它会为我要修复的错误创建一个相同的错误。
<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的版本如下:
我也尝试过更新,但仍会出现以下版本
答案 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);