XDOM API в UniVerse - PullRequest
       72

XDOM API в UniVerse

1 голос
/ 13 ноября 2009

Я создаю синтаксический анализатор и конструктор xml с использованием функций XDOM в UniVerse 10.1.0. Все идет хорошо, пока я не использую функцию XDOMAddChild. Я могу добавить отдельные элементы, используя маркеры, но я получаю ошибку при добавлении дерева. В руководствах указано, что добавление дерева в порядке.

Функция XDOMAddChild

Синтаксис

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

Описание

Функция XDOMAddChild находит xpathString в контексте xmlHandle в 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, исключение DOM произошло в функции XDOMAddChild, код исключения DOM: 4

Если я использую XDOMCreateNode для создания элемента TEST.CHILD, XDOMAddChild работает нормально. Единственное различие, которое я могу доказать, состоит в том, что вставленный узел hanlde отличается между двумя примерами. То, что работает с дескриптором узла, - это XDOM.ELEMENT.NODE (Тип 1), а другое - с ошибкой в ​​XDOM.DOC.NODE (Тип 9).

Не уверен, куда идти отсюда. Любые фрагменты кода, ссылки, указатели; с благодарностью

Ответы [ 3 ]

0 голосов
/ 15 января 2010

На самом деле я написал небольшое сообщение в блоге об ошибках U2 XDom как раз перед Рождеством.

Я предполагаю, что UniVerse и UniData используют одни и те же парсеры XDOM, так что вы сможете понять, на что ссылается эта ошибка, из документации Xalan .

В этом случае ошибка 4 относится к 'WRONG_DOCUMENT_ERR'

Надеюсь, это поможет ...

0 голосов
/ 27 января 2010

Спасибо

Суть моей проблемы заключалась в том, что я был озадачен типом «Документ» в отличие от типа «элемент».

Например: XDOMLocate можно использовать только на узле типа «Документ». Я пытался использовать эту функцию на узле типа «элемент». Приведенный ниже код не будет работать, потому что второе Locate выполняется на узле типа "element".

  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)

Все узлы не созданы равными.

0 голосов
/ 25 ноября 2009

XML-документ - это зверь другого типа, чем XML-элемент. Документ должен содержать один и только один элемент: корень документа, который содержит другие элементы. Он не может напрямую содержать атрибут или текстовые узлы. Он может содержать DTD, инструкции по обработке и объявление, которые запрещены для элемента. Элемент может содержать узлы; либо текст, атрибуты или другие элементы. Элемент не может содержать документ.

Вы ответили на свой вопрос здесь:

Если я использую XDOMCreateNode для создания элемента TEST.CHILD, XDOMAddChild работает нормально. Единственное различие, которое я могу доказать, состоит в том, что вставленный узел hanlde отличается между двумя примерами. Тот, который работает с дескриптором узла, - это XDOM.ELEMENT.NODE (Тип 1), а тот, который не работает в XDOM.DOC.NODE (Тип 9).

Не используйте XDOMOpen , используйте XDOMCreateNode ИЛИ XDOMLocate. Вам нужен элемент, атрибут или текстовый узел. Документ не будет работать.

...