使用Erlang xmerl_xpath提取xml文本时出现问题

时间:2009-09-14 10:00:25

标签: xml xpath erlang

我正在尝试使用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字符串长度的某种限制

任何想法可能会发生什么?

由于

2 个答案:

答案 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个字节的内存。