UniVerse中的XDOM API

时间:2009-11-13 07:54:33

标签: xml u2 universe

我正在使用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)中失败的那个。

不知道从哪里开始。任何代码片段,链接,指针;非常感谢

3 个答案:

答案 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)

所有节点都不是平等的。