我正在尝试使用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字符串长度的某种限制
任何想法可能会发生什么?
由于
答案 0 :(得分:2)
我刚刚遇到了相同的错误消息,我认为问题是由于未正确匹配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)))
答案 1 :(得分:1)
你的实际错误是什么?我真的不明白这是怎么回事,但是Erlang字符串会take a lot of space;整数列表实现每个字符需要8个字节的内存。