【问题标题】:UniVerse XDOM Trouble with Default NamespacesUniVerse XDOM 默认命名空间问题
【发布时间】:2013-04-26 22:33:26
【问题描述】:

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

【问题讨论】:

    标签: xml-parsing xml-namespaces universe


    【解决方案1】:

    自行搜索后发现,这其实是UniVerse的XDOM解析器本身的一个bug。有人友好地记录了一个解决方法here。您可以通过为默认命名空间命名来“欺骗”解析器工作。他们还指出,您也不能在命名空间映射中使用双引号。

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

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

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

    【讨论】:

    • 感谢您提供各种解决方案。我选择了您提供的链接中的解决方案,因为它不涉及更改 XML 文档,但两者都可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多