2

UniVerse の XDOM 関数を使用して XML ファイルを解析しようとしていますが、デフォルトの名前空間を使用する XML を正しく解析できません。名前空間を使用せずに、または名前付き名前空間を使用して XML を正しく処理できますが、既定の名前空間がある場合、すべての xPath は一致するはずのノードを見つけることができません。

簡単な例を挙げると、次の XML を解析しようとしています。

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore xmlns="http://www.example.com">
   <book category="COOKING">
      <title lang="en">Everyday Italian</title>
      <author>Giada De Laurentiis</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   <book category="CHILDREN">
      <title lang="en">Harry Potter</title>
      <author>J K. Rowling</author>
      <year>2005</year>
      <price>29.99</price>
   </book>
   <book category="WEB">
      <title lang="en">Learning XML</title>
      <author>Erik T. Ray</author>
      <year>2003</year>
      <price>39.95</price>
   </book>
</bookstore>

このコードで:

PROGRAM XDOM.TEST
$INCLUDE SYSCOM XML.H

   OPEN "XML" TO F.XML ELSE STOP "OPEN FAILED"
   READ XML FROM F.XML, 'TEST.xml' ELSE STOP "READ FAILED"

   EXIT.PROG = @FALSE

   CONVERT @FM TO CHAR(10) IN XML
   IF NOT(EXIT.PROG) AND XDOMOpen(XML, XML.FROM.STRING, XDOM) # XML.SUCCESS THEN GOSUB XML.ERR
   IF NOT(EXIT.PROG) AND XDOMLocate(XDOM, '/bookstore/book[@category="CHILDREN"]', 'xmlns=http://www.example.com', XNODE) # XML.SUCCESS THEN GOSUB XML.ERR
   IF NOT(EXIT.PROG) AND XDOMEvaluate(XNODE, './author', 'xmlns=http://www.example.com', AUTHOR) # XML.SUCCESS THEN GOSUB XML.ERR
   IF NOT(EXIT.PROG) then PRINT AUTHOR
STOP

XML.ERR:

   XML.CODE = ''
   XML.ERR = ''
   EXIT.PROG = @TRUE
   IF XMLGetError(XML.CODE, XML.ERR) = XML.SUCCESS THEN
      PRINT XML.CODE
      PRINT XML.ERR
   END

   RETURN
END

このコードをそのまま実行すると、次の出力が得られます。

10
The location path '/bookstore/book[@category="CHILDREN"]' was not found.

ただし、「xmlns= http://www.example.com」名前空間を削除すると、正常に動作します。

4

1 に答える 1

2

自分で調べたところ、これは実際には UniVerse の XDOM パーサー自体のバグであることがわかりました。誰かがここで回避策を親切に文書化しています。デフォルトの名前空間に名前を付けることで、パーサーを「だまして」動作させることができます。また、名前空間マップでも二重引用符を使用できないことにも注意してください。

個人的には、問題のある名前空間を解析する前に手動で削除するという、より単純な解決策を好みます。上記のプログラムに次の行を追加すると、非常にハックな方法ではありますが、問題が修正されます。

XML = CHANGE(XML, ' xmlns="http://www.example.com"', '')

これにより、すべての xPath ノードに不要なプレフィックスを付ける必要がなくなります。ただし、XDOM ハンドルを取得する方法によっては、これが常にオプションであるとは限りません。

于 2013-04-26T22:33:26.160 に答える