2016-07-21 3 views
1

Как сделать xml_write переменной вместо потока?SWI-Prolog xml_write to variable

Я попытался это:

current_output(O), 
with_output_to(string(X), 
       xml_write(O,[element(table, [style="width:50%"], 
          [element(tr, [span = 2], 
          [element(td, [], ['First name']), 
          element(td, [], ['Last name'])])])], 
          [header(false)])). 

Но выше по-прежнему выводит в выходной поток и, кроме того, не унифицировать X ни с чем. Вот результат:

<table style="width:50%"> 
    <tr span="2"> 
    <td>First name</td> 
    <td>Last name</td> 
    </tr> 
</table> 
O = <stream>(6D342F30), 
X = "". 

ответ

1

Вы используете xml_write/3, который имеет подпись:

xml_write(+Stream, +Term, +Options) 

для того, чтобы эффективно писать в поток. Однако, так как вы скорее хотите объединить полученный XML с переменной, посмотреть на xml_write/2, которая выглядит как:

xml_write(+Data, +Options) is det 

Используя это в вашем коде, это может выглядеть примерно так:

xml_output(X) :- 
    table(Out), 
    with_output_to(string(X), 
        xml_write(Out,[header(false)]) 
       ), 
    writeln(X). 

table(R) :- 
    R = [element(table, [style="width:50%"], 
     [element(tr, [span = 2], 
     [element(td, [], ['First name']), 
     element(td, [], ['Last name'])])])]. 

Пример запроса:

?- xml_output(R). 
    <table style="width:50%"> 
    <tr span="2"> 
     <td>First name</td> 
     <td>Last name</td> 
    </tr> 
    </table> 
    R = "<table style=\"width:50%\">\n <tr span=\"2\">\n <td>First name</td>\n <td>Last name</td>\n </tr>\n</table>". 
+1

Спасибо! Это сработало! – Ash