2009-11-13 2 views
1

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

функция XDOMAddChild

Синтаксис

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

Описание

Функция XDOMAddChild находит xpathString в контексте xmlHandle в DOM структуру и вставляет узел nodeHandle в качестве последнего дочернего узла найденного узла. Если , вставленный тип узла - XDOM.ATTR.NODE, этот узел вставляется как атрибут.

Параметры

Следующая таблица описывает каждый параметр синтаксиса. Параметр Описание

xmlHandle Ручка в контексте. [IN] xpathString Относительная или абсолютная строка Xpath. [IN] nsMap Карта пространств имен, которые разрешают префиксы в строке xpath. Формат «Xmlns = 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: Clones 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).

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

ответ

0

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

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

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

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

0

Я фактически сделал small blog post относительно ошибок U2 XDom перед Рождеством.

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

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

Надеется, что это помогает немного ...

0

Спасибо,

Сути моей проблемы в том, что я был смущен о «Документе ", в отличие от типа" element ".

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

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) 

Все узлы не созданы.

Смежные вопросы