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解析器本身的一个bug。有人在这里记录了一个解决方法。您可以通过为默认命名空间命名来“欺骗”解析器工作。他们还指出,您也不能在命名空间映射中使用双引号。

就个人而言,我更喜欢在解析之前手动剥离有问题的命名空间的更简单的解决方案。将这一行添加到上述程序中可以解决问题,尽管是以一种非常老套的方式:

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

这样您就不必在所有 xPath 节点上放置不必要的前缀。不过,这可能并不总是一种选择,具体取决于您获取 XDOM 句柄的方式。

于 2013-04-26T22:33:26.160 回答