2013-04-26 4 views
2

Я пытаюсь использовать функции XDOM UniVerse для анализа XML-файла, но я не могу его правильно обработать XML, который использует пространство имен по умолчанию. Он может корректно обрабатывать XML без пространств имен или с именами пространств имен, но если есть пространство имен по умолчанию, все xPaths не смогут найти узлы, которые должны совпадать.UniVerse XDOM Trouble с пространствами имен по умолчанию

Чтобы дать простой пример, я, пытаясь разобрать этот 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

После самостоятельного поиска, я узнал, что это фактически сам анализатор XDOM UniVerse. Кто-то прокомментировал обход here. Вы можете «обмануть» парсер в работе, указав имя для пространства имен по умолчанию. Они также отмечают, что вы также не можете использовать двойные кавычки в карте пространства имен.

Лично я предпочитаю простое решение просто вручную удалять нарушающее пространство имен перед его разбором. Добавление этой строки в указанную выше программу исправляет проблему, хотя и в очень Hacky образом:

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

Таким образом, вы не должны ставить ненужные префиксы на все ваше XPATH узлов. Это может быть не всегда вариант, в зависимости от того, как вы получаете дескриптор XDOM.

+0

Благодарим за предоставление различных решений. Я пошел с решением в ссылку, которую вы предоставили, поскольку это не связано с изменением XML-документа, но оба будут работать нормально. –