我正在使用UniVerse 10.1.0中的XDOM函数构建一个xml解析器和构造函数。在我使用XDOMAddChild函数之前情况一切正常。我可以使用句柄添加单个元素,但添加树时出错。手册表明添加一棵树很好。
XDOMAddChild功能
语法
XDOMAddChild(xmlHandle,xpathString,nsMap,nodeHandle,dupFlag)
描述
XDOMAddChild函数在上下文xmlHandle中找到xpathString DOM结构并将节点nodeHandle作为找到节点的最后一个子节点插入。如果 插入的节点类型是XDOM.ATTR.NODE,此节点作为属性插入。
参数
下表描述了语法的每个参数。 参数说明
xmlHandle上下文的句柄。 [在] xpathString相对或绝对Xpath字符串。 [在] nsMap解析xpath字符串中前缀的命名空间映射。 格式为“xmlns = default_url xmlns:prefix1 = prefix1_url 的xmlns:prefix2 = prefix2_url”
例如: “的xmlns = http://myproject.mycompany.com xmlns:a_prefix = a.mycompany.com“[IN]
nodeHandle处理DOM子树。如果nodeHandle指向DOM文档, 所有的孩子都按照相同的顺序插入。 [IN]
dupFlag XDOM.DUP:克隆nodeHandle,并插入重复节点。 XDOM.NODUP:插入原始节点。子树也被删除 从它原来的位置。 [IN]
我接受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工作正常。 我可以证明唯一的区别是插入节点hanlde在两个示例之间是不同的。运行nodehandle的是XDOM.ELEMENT.NODE(类型1)和XDOM.DOC.NODE(类型9)中失败的那个。
不知道从哪里开始。任何代码片段,链接,指针;非常感谢
答案 0 :(得分:0)
XML文档是一种与XML元素不同的野兽。文档必须包含一个且仅包含一个元素:文档根目录,其中包含其他元素。它不能直接包含属性或文本节点。它可以包含DTD,处理指令和声明,所有这些都禁止元素包含。元素可以包含节点;文本,属性或其他元素。元素不能包含文档。
你在这里回答了自己的问题:
如果我使用XDOMCreateNode创建TEST.CHILD元素,XDOMAddChild工作正常。我可以证明唯一的区别是插入节点hanlde在两个示例之间是不同的。运行nodehandle的是XDOM.ELEMENT.NODE(类型1)和XDOM.DOC.NODE(类型9)中失败的那个。
不要使用XDOMOpen ,请使用XDOMCreateNode或XDOMLocate。您需要元素,属性或文本节点。文件不起作用。
答案 1 :(得分:0)
我实际上在圣诞节前就制作了一个关于U2 XDom错误的small blog post。
我假设UniVerse和UniData使用相同的XDOM解析器,因此您应该能够从Xalan documentation计算出错误引用的内容。
在这种情况下,错误4引用'WRONG_DOCUMENT_ERR'
希望它有所帮助...
答案 2 :(得分:0)
谢谢,
我的问题的症结在于我对“文档”类型感到困惑,而不是“元素”类型。
例如:您只能在“文档”类型节点上使用XDOMLocate。我试图在“元素”类型节点上使用此函数。下面的代码不起作用,因为第二个定位是在“元素”类型节点上执行的。
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)
DATA $ 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)
所有节点都不是平等的。