You could write your own XML Parser.. no seriously! Check out Parslet
Infact the examples it comes with include an XML Parser
像这样的事情:
require parslet
class XML < Parslet::Parser
root :document
rule(:document) { (formatting | text).repeat(1) }
rule(:formatting) { tag_pair( b ).as(:bold) | tag_pair( u ).as(:underline) | tag_pair( i ).as(:italic) }
def tag(type)
str( < ) >> str(type) >> str( > )
end
def tag_pair(type)
tag(type) >> document.maybe >> tag("/" + type)
end
rule(:text) {
match( [^<>] ).repeat(1).as(:text)
}
end
parser = XML.new
input = ARGV[0]
require parslet/convenience
puts parser.parse_with_debug(input).inspect
产生像这样的东西...
> ruby xmlparser.rb "<b>bold<i>italic</i> bold again <u>underlined</u></b>"
[{:bold}gt;{{{{{{{{{{{{:text}}gt;"bold}}{{{{{{{{{{{{{{{{{{{{{{{}}}}{{{{{{{{{{{}}}{{{{{{{{{{}}}}{{{{{{{{{{{{}}}}}{{{{{{{{{{{{{}}}}}{{{{{{{{{{{}}}}}}{{{{{{{{{{{}}}}}}}{{{{{{{{{{{{{{}}}}}}}}}{{{{{{{{{{{{{{{{{{{}}}}}}}{{{{{{{}}}}}}}}}}}}}{{{{{{{{{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
正如你可以看到的,这棵树有风格的结点, 用于大胆的斜体等, 以及其中的内容。
它可以很容易地扩展到处理白色空间, 并处理您所关心的其他标签。 处理您所不关心的标签要困难得多。
总之,只是展示各种可能性。
使用 Parslet, 您通常会先写入一个变换类, 将此树结构转换为您想要最终完成的工作 。 我喜欢 Parslet 使用解析数据进行解析的方式 。
希望这能帮上忙