解析 REXML 文档,忽略空格

发布于 2024-10-22 17:25:56 字数 1410 浏览 5 评论 0原文

REXML 应该忽略标识或空格吗?

我正在使用 简单 HTML 到 Markdown 转换器 调试问题。由于某种原因,它失败了

<blockquote><p>foo</p></blockquote>

但不是 on

<blockquote>
  <p>foo</p>
</blockquote>

原因是,在第一种情况下,未设置 type.children.first.value ,在后一种情况下则设置了。 原始代码可以在上面的链接中找到,但显示问题的压缩片段如下:

require 'rexml/document'
include REXML

def parse_string(string)
  doc = Document.new("<root>\n"+string+"\n</root>")
  root = doc.root
  root.elements.each do |element|
    parse_element(element, :root)
  end
end

def parse_element(element, parent)
  @output = ''
  # ...
  @output << opening(element, parent)
  #...
end

def opening(type, parent)
  case type.name.to_sym
    #...
    when :blockquote
       # remove leading newline
      type.children.first.value = ""
      "> "
  end
end

#Parses just fine
puts parse_string("<blockquote>\n<p>foo</p>\n</blockquote>")

# Fails with undefined method `value=' for <p> ... </>:REXML::Element (NoMethodError)
puts parse_string("<blockquote><p>foo</p></blockquote>")

我很确定,这是由于某些参数使 REXML 需要空格和标识:为什么它会解析第一个 XML 与后者?

我可以强制 REXML 对两者进行相同的解析吗?或者我正在寻找一种完全不同类型的错误?

Should REXML ignore identation or whitespacing?

I am debugging an issue with a simple HTML to Markdown convertor. For some reason it fails on

<blockquote><p>foo</p></blockquote>

But not on

<blockquote>
  <p>foo</p>
</blockquote>

The reason is, that in the first case, type.children.first.value is not set, in the latter case it is.
The original code can be found at link above, but a condensed snipped to show the problem is below:

require 'rexml/document'
include REXML

def parse_string(string)
  doc = Document.new("<root>\n"+string+"\n</root>")
  root = doc.root
  root.elements.each do |element|
    parse_element(element, :root)
  end
end

def parse_element(element, parent)
  @output = ''
  # ...
  @output << opening(element, parent)
  #...
end

def opening(type, parent)
  case type.name.to_sym
    #...
    when :blockquote
       # remove leading newline
      type.children.first.value = ""
      "> "
  end
end

#Parses just fine
puts parse_string("<blockquote>\n<p>foo</p>\n</blockquote>")

# Fails with undefined method `value=' for <p> ... </>:REXML::Element (NoMethodError)
puts parse_string("<blockquote><p>foo</p></blockquote>")

I am quite certain, this is due to some parameter that makes REXML require whitespacing and identation: why else would it parse the first XML different from the latter?

Can I force REXML to parse both the same? Or am I looking at a whole different kind of bug?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

掩饰不了的爱 2024-10-29 17:25:56

尝试将选项 :ignore_whitespace_nodes=>:all 传递给 Document.new()。

Try passing the option :ignore_whitespace_nodes=>:all to Document.new().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文