首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UniVerse中的XDOM API

UniVerse中的XDOM API
EN

Stack Overflow用户
提问于 2009-11-13 15:54:33
回答 3查看 1.1K关注 0票数 1

我正在使用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的缺点和缺陷(特别是在构建名称空间前缀方面),并愿意使用它们,但这可能是我正在使用的当前逻辑的一个障碍。下面是一些测试代码:

代码语言:javascript
复制
$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)。

不知道下一步该怎么走。任何代码片段,链接,指针;非常感谢

EN

回答 3

Stack Overflow用户

发布于 2009-11-25 06:24:42

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

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

如果我使用XDOMCreateNode创建TEST.CHILD元素,XDOMAddChild就能正常工作。我能证明的唯一区别是插入的节点处理在这两个例子中是不同的。工作于节点句柄的是XDOM.ELEMENT.NODE (类型1),失败的是XDOM.DOC.NODE (类型9)。

不要使用XDOMOpen,请使用XDOMCreateNode或XDOMLocate。您需要一个元素、属性或文本节点。文档不起作用。

票数 0
EN

Stack Overflow用户

发布于 2010-01-15 07:23:06

实际上,就在圣诞节之前,我做了一个关于U2 XDom错误的small blog post

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

在本例中,错误4指向'WRONG_DOCUMENT_ERR‘

希望对你有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2010-01-27 11:00:08

谢谢,

我的问题的症结在于我混淆了“文档”类型和“元素”类型。

你只能在“文档”类型节点上使用XDOMLocate。我试图在一个"element“Type节点上使用这个函数。下面的代码将不起作用,因为第二次定位是在"element“Type节点上执行的。

代码语言:javascript
复制
  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“。这就是怎么做的..

代码语言:javascript
复制
  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)

并非所有节点都是平等创建的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1727776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档