我正在使用UniVerse 10.1.0中的XDOM函数构建一个xml解析器和构造器。在我开始使用XDOMAddChild函数之前,一切都很顺利。我可以使用句柄很好地添加单个元素,但在添加树时出现错误。手册指出添加一棵树是很好的。
XDOMAddChild函数
语法
XDOMAddChild(xmlHandle、xpathString、nsMap、nodeHandle、dupFlag)
描述
XDOMAddChild函数在DOM结构的上下文xmlHandle中查找xpathString,并插入一个节点nodeHandle作为找到的节点的最后一个子节点。如果插入的节点类型为XDOM.ATTR.NODE,则此节点将作为属性插入。
参数
下表描述了语法的每个参数。参数说明
xmlHandle上下文的句柄。在xpathString相对或绝对Xpath字符串中。在nsMap中,解析xpath字符串中的前缀的名称空间的映射。格式为“xmlns=default_url xmlns:prefix1=prefix1_url xmlns:prefix2=prefix2_url”
例如:“xmlns=http://myproject.mycompany.comxmlns:a_prefix=a.mycompany.com”IN
DOM子树的nodeHandle句柄。如果nodeHandle指向一个DOM文档,则以相同的顺序插入它的所有子文档。在……里面
dupFlag XDOM.DUP:克隆nodeHandle,并插入重复的节点。XDOM.NODUP:插入原始节点。子树也将从其原始位置移除。在……里面
我接受XDOM的缺点和缺陷(特别是在构建名称空间前缀方面),并愿意使用它们,但这可能是我正在使用的当前逻辑的一个障碍。下面是一些测试代码:
$INCLUDE UNIVERSE.INCLUDE XML.H
DATA.REQ = '<logonResponse></logonResponse>'
TEST.CHILD = '<logon>HELP</logon>'
NSMAP = ''
*
ERR$ = XDOMOpen(DATA.REQ, XML.FROM.STRING, DOM$H)
Status = XMLGetError(ERR$,errMsg)
PRINT ERR$:',':errMsg
ERR$ = XDOMOpen(TEST.CHILD, XML.FROM.STRING, CHILD$H)
Status = XMLGetError(ERR$,errMsg)
PRINT ERR$:',':errMsg
ERR$ = XDOMLocate(DOM$H,'//logonResponse',NSMAP,NOD$H)
Status = XMLGetError(ERR$,errMsg)
PRINT ERR$:',':errMsg
ERR$ = XDOMWrite(NOD$H,JUNK,XML.TO.STRING)
PRINT JUNK
ERR$ = XDOMWrite(CHILD$H,JUNK,XML.TO.STRING)
PRINT JUNK
ERR$ = XDOMAddChild(DOM$H, '',NSMAP,CHILD$H, XDOM.NODUP)
IF ERR$ = XML.SUCCESS THEN PRINT 'SUCCESS'
IF ERR$ = XML.ERROR THEN PRINT 'ERROR'
IF ERR$ = XML.INVALID.HANDLE THEN PRINT 'INVALID'
Status = XMLGetError(ERR$,errMsg)
PRINT ERR$:',':errMsg
END我拿到这个了..。
1004,函数XDOMAddChild中发生DOM异常,DOM异常代码:4
如果我使用XDOMCreateNode创建TEST.CHILD元素,XDOMAddChild就可以正常工作。我能证明的唯一区别是插入的节点处理在这两个例子中是不同的。工作于节点句柄的是XDOM.ELEMENT.NODE (类型1),失败的是XDOM.DOC.NODE (类型9)。
不知道下一步该怎么走。任何代码片段,链接,指针;非常感谢
发布于 2009-11-25 06:24:42
XML文档是一种与XML元素不同的类型。文档必须包含且只能包含一个元素:文档根,它包含其他元素。它不能直接包含属性或文本节点。它可以包含DTD、处理指令和声明,所有这些都是禁止元素包含的。元素可以包含节点;可以是文本、属性或其他元素。元素不能包含文档。
你在这里回答了你自己的问题:
如果我使用XDOMCreateNode创建TEST.CHILD元素,XDOMAddChild就能正常工作。我能证明的唯一区别是插入的节点处理在这两个例子中是不同的。工作于节点句柄的是XDOM.ELEMENT.NODE (类型1),失败的是XDOM.DOC.NODE (类型9)。
不要使用XDOMOpen,请使用XDOMCreateNode或XDOMLocate。您需要一个元素、属性或文本节点。文档不起作用。
发布于 2010-01-15 07:23:06
实际上,就在圣诞节之前,我做了一个关于U2 XDom错误的small blog post。
我假设UniVerse和UniData使用相同的XDOM解析器,因此您应该能够从Xalan documentation中找出该错误所指的内容。
在本例中,错误4指向'WRONG_DOCUMENT_ERR‘
希望对你有所帮助。
发布于 2010-01-27 11:00:08
谢谢,
我的问题的症结在于我混淆了“文档”类型和“元素”类型。
你只能在“文档”类型节点上使用XDOMLocate。我试图在一个"element“Type节点上使用这个函数。下面的代码将不起作用,因为第二次定位是在"element“Type节点上执行的。
XMLDOC = <rootNode><nodeItem><data>aaa</data></nodeItem><nodeItem><data>bbb</data></nodeItem></rootNode>
ERR$ = XDOMLocate(DOM$H,'//rootNode','',NOD$H)
ERR$ = XDOMLocateNode(NOD$H,XDOM.CHILD,XDOM.LAST.CHILD,XDOM.ELEMENT.NODE,SUBNOD$H)
ERR$ = XDOMLocate(SUBNOD$H,'//nodeItem/data','',DATA$H)
ERR$ = XDOMLocateNode(DATA$H, XDOM.CHILD, XDOM.FIRST.CHILD, XDOM.TEXT.NODE, TEXT.NODE)
ERR$ = XDOMGetNodeValue(TEXT.NODE, DATA$VALUE)数据$VALUE不会被提取到"bbb“。这就是怎么做的..
ERR$ = XDOMLocate(DOM$H,'//rootNode/nodeItem[2]/data'','',DATA$H)
ERR$ = XDOMLocateNode(DATA$H, XDOM.CHILD, XDOM.FIRST.CHILD, XDOM.TEXT.NODE, TEXT.NODE)
ERR$ = XDOMGetNodeValue(TEXT.NODE, DATA$VALUE)并非所有节点都是平等创建的。
https://stackoverflow.com/questions/1727776
复制相似问题