我正在尝试使用Erlang的xmerl_xpath
从xml节点提取文本:
[include "xmerl.hrl"]
{Doc, _}=xmerl_scan:string("<node>Hello World</node>").
[#xmlText{value=Text}]=xmerl_xpath:string("//node/text()", Doc).
Text.
"Hello World"
对于这个简单的示例,效果很好。当节点元素中的文本很大(例如1MB)时,就会发生问题。 xmerl_scan:string可以正常工作(即文档可以解析),但是尝试提取文本会产生以下错误:
{{badmatch,[{xmlText,[{node,1}],1,[],"[large text here]"}]}}
我想也许
a)当文本大小很大时,xmerl_scan:string会产生不同的文档结构
b)我已达到Erlang字符串长度的某种限制
任何想法可能会发生什么?
谢谢
最佳答案
我只是遇到了相同的错误消息,我认为问题是由于xmerl_xpath:string()
返回的不正确匹配引起的,例如它返回docEntity()
事物的列表,在这种情况下,它们都是#xmlText{}
记录。我通过从#xmlText{}
记录中提取所有字符串值,然后使用lists:concat
串联列表来修复它。
所以这:
[#xmlText{value=Text}]=xmerl_xpath:string("//node/text()", Doc)
仅与一个
#xmlText
完全匹配,而使用长字符串则可能会获得多个#xmlText
记录。这可能是因为XML解析器将长字符串解析为多个文本节点。我认为这样做会更好:
Text = lists:concat(map(fun(XmlText) -> #xmlText{value=TextValue} = XmlText, TextValue end, xmerl_xpath:string("//node/text()", Doc)))
关于xml - 使用Erlang xmerl_xpath提取xml文本时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1420646/