1

我正在使用 UniVerse 10.1.0 中的 XDOM 函数构建一个 xml 解析器和构造函数。在我开始使用 XDOMAddChild 函数之前,一切都很顺利。我可以使用句柄很好地添加单个元素,但添加树时出现错误。手册表明添加树很好。

XDOMAddChild 函数

句法

XDOMAddChild(xmlHandle, xpathString, nsMap, nodeHandle, dupFlag)

描述

XDOMAddChild 函数在 DOM 结构中的上下文 xmlHandle 中找到 xpathString,并插入一个节点 nodeHandle 作为找到的节点的最后一个子节点。如果插入的节点类型是 XDOM.ATTR.NODE,则该节点作为属性插入。

参数

下表描述了语法的每个参数。参数说明

xmlHandle 上下文句柄。[IN] xpathString 相对或绝对 Xpath 字符串。[IN] nsMap 解析 xpath 字符串中前缀的命名空间映射。格式为“xmlns=default_url xmlns:prefix1=prefix1_url xmlns:prefix2=prefix2_url”</p>

例如:“xmlns= http://myproject.mycompany.com xmlns:a_prefix=a.mycompany.com” [IN]

nodeHandle DOM 子树的句柄。如果 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 工作正常。我可以证明的唯一区别是插入的节点 hanlde 在 2 个示例之间是不同的。使用节点句柄的一种是 XDOM.ELEMENT.NODE(类型 1),而在 XDOM.DOC.NODE(类型 9)中失败的一种。

不知道从这里去哪里。任何代码片段、链接、指针;非常感激

4

3 回答 3

0

An XML Document is a different kind of beast than an XML Element. A document must contain one, and only one element: the document root, which contains the other elements. It's can't directly contain attribute or text nodes. It can contain DTDs, processing instructions, and a declaration, all of which are forbidden for an element to contain. An element can contain nodes; either text, attributes or other elements. An element can't contain a document.

You answered your own question here:

If I use XDOMCreateNode to create the TEST.CHILD element, the XDOMAddChild works fine. The only difference I can prove ids that the inserted node hanlde is different between teh 2 examples. The one that works the nodehandle is XDOM.ELEMENT.NODE (Type 1) and the one that fails in XDOM.DOC.NODE (Type 9).

Don't use XDOMOpen, use XDOMCreateNode OR XDOMLocate. You need an element, attribute or text node. A document won't work.

于 2009-11-24T22:24:42.477 回答
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)

所有节点都不是平等的。

于 2010-01-27T03:00:08.370 回答
0

实际上,我在圣诞节前写了一篇关于 U2 XDom 错误的小博文。

我假设 UniVerse 和 UniData 使用相同的 XDOM 解析器,因此您应该能够从Xalan 文档中找出该错误所指的内容。

在这种情况下,错误 4 指的是“WRONG_DOCUMENT_ERR”

希望它有所帮助...

于 2010-01-14T23:23:06.427 回答