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 は正常に機能します。私が証明できる唯一の違いは、挿入されたノードのハンドルが 2 つの例の間で異なることです。ノードハンドルで動作するのは XDOM.ELEMENT.NODE (タイプ 1) で、失敗するのは XDOM.DOC.NODE (タイプ 9) です。

ここからどこへ行くべきかわからない。コード スニペット、リンク、ポインタ。大変感謝しています

4

3 に答える 3

0

ありがとう、

私の問題の核心は、「要素」タイプではなく「ドキュメント」タイプについて混乱していたことです。

例: XDOMLocate は、"Document" タイプ ノードでのみ使用できます。「要素」タイプノードでこの関数を使用しようとしていました。2 番目の Locate が「要素」タイプ ノードで実行されるため、以下のコードは機能しません。

  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 に答える
0

XML ドキュメントは、XML 要素とは異なる種類の獣です。ドキュメントには、他の要素を含むドキュメント ルートという要素が 1 つだけ含まれている必要があります。属性またはテキスト ノードを直接含めることはできません。DTD、処理命令、および宣言を含めることができますが、要素に含めることはすべて禁止されています。要素にはノードを含めることができます。テキスト、属性、またはその他の要素のいずれか。要素にドキュメントを含めることはできません。

あなたはここであなた自身の質問に答えました:

XDOMCreateNode を使用して TEST.CHILD 要素を作成すると、XDOMAddChild は正常に機能します。私が証明できる唯一の違いは、挿入されたノードのハンドルが 2 つの例の間で異なることです。ノードハンドルで動作するのは XDOM.ELEMENT.NODE (タイプ 1) で、失敗するのは XDOM.DOC.NODE (タイプ 9) です。

XDOMOpen を使用しないでください。XDOMCreateNode または XDOMLocate を使用してください。要素、属性、またはテキスト ノードが必要です。ドキュメントは機能しません。

于 2009-11-24T22:24:42.477 に答える