UniVerse XDOM使用默认命名空间时遇到问题

时间:2013-04-26 22:33:26

标签: xml-parsing xml-namespaces universe

我正在尝试使用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”命名空间,它可以正常工作。

1 个答案:

答案 0 :(得分:2)

在我自己搜索之后,我发现这实际上是UniVerse的XDOM解析器本身的错误。有人记录了一项解决方法here。您可以通过为默认命名空间命名来“欺骗”解析器。他们还注意到你不能在命名空间映射中使用双引号。

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

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

这样您就不必在所有xPath节点上添加不必要的前缀。但这可能并不总是一个选项,具体取决于您获取XDOM句柄的方式。