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

标签 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字符串长度的某种限制

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

谢谢

最佳答案

我只是遇到了相同的错误消息,我认为问题是由于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/

相关文章:

erlang - 是否有内置函数来检查一个列表是否包含在另一个列表中?在 ELIXIR 或 ERLANG

ruby - 有没有一种简单的方法可以在 Ruby 中用任意基数表示整数?

java - Jackson XML - 使用 namespace 前缀反序列化 XML

python - XPath 选择所有但不选择 self::strong 和 self::strong/following-sibling::text()

xml - 使用 XPath 函数 fn :replace from XSLT

xml - BaseX 上的 Xpath/Xquery 没有返回任何结果

android - 是否有适用于 Android 的 Erlang 实现?

java - 在 Java 中下载并解析 XML 文件

java - 使用 SAX 解析 XML

通过 VBScript 的 SQLXMLBulkLoad