UniVerse 中的 XDOM API

发布于 2024-08-10 16:39:56 字数 2246 浏览 2 评论 0原文

我正在使用 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 工作正常。 我可以证明的唯一区别是插入的节点处理在这两个示例之间是不同的。节点句柄有效的一个是 XDOM.ELEMENT.NODE(类型 1),而失败的一个是 XDOM.DOC.NODE(类型 9)。

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

I am building an xml parser and constructor using the XDOM functions in UniVerse 10.1.0. Things are going fine until I get to use the XDOMAddChild function. I can add single elements fine using the handles but I get an error when adding a tree. The manuals indicate adding a tree is fine.

XDOMAddChild function

Syntax

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

Description

The XDOMAddChild function finds the xpathString in the context xmlHandle in the
DOM structure and inserts a node nodeHandle as the last child of the found node. If
the inserted node type is XDOM.ATTR.NODE, this node is inserted as an attribute.

Parameters

The following table describes each parameter of the syntax.
Parameter Description

xmlHandle The handle to the context. [IN]
xpathString Relative or absolute Xpath string. [IN]
nsMap The map of namespaces which resolve the prefixes in the xpath string.
Format is “xmlns=default_url xmlns:prefix1=prefix1_url
xmlns:prefix2=prefix2_url”

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

nodeHandle Handle to a DOM subtree. If nodeHandle points to a DOM document,
all of its children are inserted, in the same order. [IN]

dupFlag XDOM.DUP: Clones nodeHandle, and inserts the duplicate node.
XDOM.NODUP: Inserts the original node. The subtree is also removed
from its original location. [IN]

I accept the XDOM faults and flaws (particularly with building namespace prefixes) and an willing to work with them, But this one may be a show stopper with the current logic I am using. This is some test code:

$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

I get this back....

1004,A DOM exception occured in function XDOMAddChild, DOM Exception code: 4

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).

Not sure where to go from here. Any code snippets, links, pointers; greatly appreciated

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

岁吢 2024-08-17 16:39:56

XML 文档与 XML 元素不同。文档必须包含一个且仅一个元素:文档根,其中包含其他元素。它不能直接包含属性或文本节点。它可以包含 DTD、处理指令和声明,元素禁止包含所有这些内容。一个元素可以包含节点;文本、属性或其他元素。元素不能包含文档。

您在这里回答了自己的问题:

如果我使用 XDOMCreateNode 创建 TEST.CHILD 元素,则 XDOMAddChild 工作正常。我可以证明的唯一区别是插入的节点处理在这两个示例之间是不同的。运行节点句柄的是 XDOM.ELEMENT.NODE(类型 1),而运行失败的节点句柄是 XDOM.DOC.NODE(类型 9)。

不要使用 XDOMOpen,使用 XDOMCreateNode 或 XDOMLocate。您需要一个元素、属性或文本节点。一个文档是行不通的。

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.

≈。彩虹 2024-08-17 16:39:56

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

我假设 UniVerse 和 UniData 使用相同的 XDOM 解析器,因此您应该能够从 Xalan 文档

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

希望它有所帮助......

I actually made a small blog post regarding U2 XDom errors just before Christmas.

I assume UniVerse and UniData use the same XDOM parsers, so you can should be able to work out what that error refers to from the Xalan documentation.

In this case, Error 4 refers to 'WRONG_DOCUMENT_ERR'

Hope it helps somewhat...

人生戏 2024-08-17 16:39:56

谢谢,

我的问题的症结是我对“文档”类型与“元素”类型感到困惑。

例如:您只能在“文档”类型节点上使用 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)

并非所有节点都生而平等。

Thanks,

The crux of my problem was that I was confused about the "Document" type as opposed to the "element" type.

eg: You can only use XDOMLocate on the "Document" Type Node. I was trying to use this function on a "element" Type node. The code below will no work because the 2nd Locate is performed on an "element" Type node.

  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 will not be extracted to "bbb". This is how to do it..

  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)

All nodes are not created equal.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文