2012-01-25 38 views
1

我正在做一個REST調用,並接收該XML回:如何在Erlang中解碼/忽略HTML實體?

<replacement><![CDATA[this is &amp; ampersand]]></replacement> 

我substringed的是,我真正關心的一些有關:

this is &amp; ampersand 

如何我現在這個片段解碼成(我不使用雅司病):

this is & ampersand 

回答

0

例如

repl([],Acc) -> lists:reverse(Acc); 
repl([$&,$a,$m,$p,$;|T],Acc) -> repl(T,[$&|Acc]); 
repl([H|T],Acc) -> repl(T,[H|Acc]). 

檢查

repl("this is &amp; ampersand",[]). 
"this is & ampersand" 

(更新)如果您需要更換從CDATA字符串中的所有實體,您可以添加虛假的開始標記解決此字符串並解析爲XML。

種類:

{{_,_,_,_,_,_,_,_,Lst,_,_,_},_} = 
    xmerl_scan:string("<root>"++YourStingHere++"</root>"), 
    lists:foldl(fun ({_,_,_,_,X,text},Acc) -> AcC++ X end, [],Lst). 

檢查:

{{_,_,_,_,_,_,_,_,Lst,_,_,_},_} = 
     xmerl_scan:string("<root>"++"aaa V&amp;H &lt;- "++"</root>"). 
lists:foldl(fun ({_,_,_,_,X,text},Acc) -> AcC++ X end, [],Lst). 

"aaa V&H <- " 
+0

對單個案例來說這很好,但其他HTML實體呢? http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references我希望有一個函數已經隱藏在圖書館裏了。 – PnzrDrgoon

+0

此更新將完美工作。非常感謝您的幫助。 – PnzrDrgoon

+0

使用include_lib(「xmerl/include/xmerl.hrl」)包含內置的xmerl頭文件會產生更具可讀性和麪向將來的代碼。例如,「{_,_,_,_,X,text}」將變爲「Foo#xmlText.value」,並且「{_,_,_,_,_,_,_,_,Lst, ,_,_}'可以替換爲'Foo#xmlElement.content'。 – dnet

0

這要看什麼類型的數據,你有。如果這是一個ASCII文本,你可以用@Odobenus Rosmarus所說的「&」符號替換它,如果這是一個Unicode,那麼你會做一些額外的工作。請看this項目或使用標準unicode模塊。