Проблема извлечения XML-текста с Erlang xmerl_xpath - PullRequest
1 голос
/ 14 сентября 2009

Я пытаюсь извлечь текст из узла xml, используя Erlang's xmerl_xpath:

[include "xmerl.hrl"]

{Doc, _}=xmerl_scan:string("<node>Hello World</node>").

[#xmlText{value=Text}]=xmerl_xpath:string("//node/text()", Doc).

Text.

"Hello World"

Отлично работает для этого простого примера. Проблема возникает, когда текст в элементе узла очень большой, скажем, 1 МБ; xmerl_scan: строка работает нормально [т.е. документ анализируется нормально], но попытка извлечь текст приводит к этой ошибке:

{{badmatch,[{xmlText,[{node,1}],1,[],"[large text here]"}]}}

Я подумал, может быть

a) xmerl_scan: строка создает другую структуру документа, когда размер текста очень большой

б) Я достиг некоторого предела для длины строки Эрланга

Есть идеи, что может произойти?

Спасибо

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

Я только что столкнулся с тем же сообщением об ошибке, и я думаю, что проблема вызвана неправильным совпадением того, что возвращает 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 голос
/ 14 сентября 2009

Какая была ваша настоящая ошибка? Я не понимаю, как это может быть причиной, но строки Erlang занимают много места ; реализация целочисленного списка занимает 8 байтов памяти на символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...