使用Erlang xmerl_xpath提取xml文本时出现问题
我正在尝试使用Erlang的使用Erlang xmerl_xpath提取xml文本时出现问题,xml,xpath,erlang,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" 我想也许 a) xmerl_scan:当文本大小非常大时,字符串会
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"
我想也许
a) xmerl_scan:当文本大小非常大时,字符串会生成不同的文档结构
b) 我已经达到了Erlang字符串长度的某种限制
你知道会发生什么吗
谢谢您的实际错误是什么?我真的不明白这是什么原因,但Erlang字符串会;整数列表实现每个字符占用8字节的内存。我刚刚遇到了相同的错误消息,我认为问题是由于没有正确匹配
xmerl\u 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字符串的例子吗?你真的需要看看(a)xml和(b)你试图匹配的模式。1Mb没有那么大。(c)可选地调用xmerl_scan:string():)的返回值错误如下:{{badmatch,[{xmlText,[{node,1}],1,[],“[large text here]”}}}}如果是内存问题,加载模块本身会失败,不是吗?这是一个需要注意的相关问题,尤其是在从shell进行测试时,不允许已绑定变量文本。如果它已经绑定(与搜索返回的文本字符串不同),那么会出现相同的症状。如果输入错误,map()应该是lists:map(),如:text=lists:concat(lists:map(fun(XmlText)->#XmlText{value=TextValue}=XmlText,TextValue end,xmerl\u xpath:string(//node/text(),Doc)))
Text = lists:concat(map(fun(XmlText) -> #xmlText{value=TextValue} = XmlText, TextValue end, xmerl_xpath:string("//node/text()", Doc)))