2013-04-26 59 views
2

我想使用UniVerse的XDOM函數來解析XML文件,但我無法正確解析使用默認命名空間的XML。它可以正確處理沒有名稱空間或命名空間的XML,但是如果存在默認名稱空間,則所有xPath都無法找到它們應該匹配的節點。UniVerse XDOM使用默認命名空間的問題

舉一個簡單的例子,我,試圖解析這個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」 命名空間,它工作正常。

回答

2

經過我自己的搜索後,我發現這實際上是UniVerse的XDOM解析器本身的一個錯誤。有人親切地記錄瞭解決方法here。您可以通過給默認命名空間命名來「愚弄」解析器進入工作狀態。他們還指出,您不能在名稱空間映射中使用雙引號。

就個人而言,我更喜歡簡單的解決方案,只是在解析它之前手動刪除違規名稱空間。添加此行上述程序修復了問題,儘管在一個非常哈克的方式:

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

這樣,您就不必把不必要的前綴所有的XPath節點上。這可能並不總是一個選項,取決於你如何獲得XDOM句柄。

+0

感謝您提供各種解決方案。我在你提供的鏈接中使用瞭解決方案,因爲它不涉及更改XML文檔,但兩者都可以正常工作。 – 2013-05-16 23:44:24