【问题标题】:Parsing encoded tags in Ruby XML document using Nokogiri and regex使用 Nokogiri 和正则表达式解析 Ruby XML 文档中的编码标签
【发布时间】:2011-12-24 09:40:01
【问题描述】:

我正在尝试使用嵌入在标签中的标签解析 XML,例如使用 Nokigiri 和 Ruby:

<seg>Trennmesser <ph>&lt;I.FIGREF ITEM=&quot;3&quot; FORMAT=&quot;PARENTHESIS&quot;&gt;</ph><bpt i="1">&lt;I.FIGTARGET TARGET=&quot;CIADDAJA&quot;&gt;</bpt><ept i="1">&lt;/I.FIGREF&gt;</ept></seg>

在这种情况下,我只需要嵌入标签中的单词“Trennmesser”。

在第二个例子中:

<seg>Hilfsmittel <ph>&lt;F34@Z7@Lge&gt;</ph>X <ph>&lt;F0&gt;</ph>= 0,5mm zwischen    Beschleunigerwalze <ph>&lt;F34@Z7@Lge&gt;</ph>D<ph>&lt;F0&gt;</ph> und Trennmesser schieben.</seg>

封闭的/ph 和开放的ph 标记中的单词也很有趣,因此正则表达式需要提取字符串“Hilfsmittel 0,5mm zwischen Beschleunigerwalze und Trennmesser schieben.”并丢弃其他所有内容。

我这里也上传了部分文档:
http://pastebin.com/Q8CdnASz

【问题讨论】:

    标签: ruby-on-rails ruby xml parsing nokogiri


    【解决方案1】:

    在 irb 中试试这个

    require 'nokogiri'
    x = Nokogiri::XML.parse('<seg>Hilfsmittel <ph>&lt;F34@Z7@Lge&gt;</ph>X <ph>&lt;F0&gt;</ph>= 0,5mm zwischen    Beschleunigerwalze <ph>&lt;F34@Z7@Lge&gt;</ph>D<ph>&lt;F0&gt;</ph> und Trennmesser schieben.</seg>')
    x.xpath('//seg').children.reject {|x| x.element?}.join {|x| x.content}
    

    对我来说这个输出

    => "Hilfsmittel X = 0,5mm zwischen    Beschleunigerwalze D und Trennmesser schieben."
    

    这里的想法是我们迭代&lt;seg&gt;标签的子元素,拒绝那些本身就是元素的元素(&lt;ph&gt;),这应该只留下内容元素。获取结果数组,并将内容元素连接在一起作为一个字符串。

    请注意,输出与您描述的略有不同,因为在两个标签之间还有一个额外的 DX

    【讨论】:

      【解决方案2】:

      &lt;ph&gt; 标签内的内容已被编码以保留保留字符 &lt;&gt;

      解决这个问题的一个干净方法是让 Nokogiri 将这些块重新解析回 XML:

      require 'nokogiri'
      
      doc = Nokogiri::XML('<seg>Trennmesser <ph>&lt;I.FIGREF ITEM=&quot;3&quot; FORMAT=&quot;PARENTHESIS&quot;&gt;</ph><bpt i="1">&lt;I.FIGTARGET TARGET=&quot;CIADDAJA&quot;&gt;</bpt><ept i="1">&lt;/I.FIGREF&gt;</ept></seg>')
      
      ph = Nokogiri::XML::DocumentFragment.parse(doc.at('seg ph').content)
      puts ph.to_xml
      

      输出以下节点,显示 Nokogiri 正确地重新创建了该片段:

      <I.FIGREF ITEM="3" FORMAT="PARENTHESIS"/>
      

      用于提取&lt;seg&gt;标签内的文本:

      doc.at('//seg/text()').text
      => "Trennmesser "
      

      在处理 HTML 或 XML 时,假定 regex 将是提取某些内容的最佳途径从来都不是一件好事。 HTML 和 XML 都太不规则和“灵活”(灵活意味着它经常出现令人讨厌的格式错误或以完全独特和意想不到的方式定义)。

      获取第二个问题&lt;seg&gt;标签内的全部内容:

      require 'nokogiri'
      
      doc = Nokogiri::XML('<seg>Hilfsmittel <ph>&lt;F34@Z7@Lge&gt;</ph>X <ph>&lt;F0&gt;</ph>= 0,5mm zwischen    Beschleunigerwalze <ph>&lt;F34@Z7@Lge&gt;</ph>D<ph>&lt;F0&gt;</ph> und Trennmesser schieben.</seg>')
      
      seg = Nokogiri::XML::DocumentFragment.parse(doc.at('seg').content)
      puts seg.content
      

      哪些输出:

      Hilfsmittel @Z7@Lge>X = 0,5mm zwischen    Beschleunigerwalze @Z7@Lge>D und Trennmesser schieben.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-24
        • 1970-01-01
        • 2011-03-17
        • 2021-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-17
        相关资源
        最近更新 更多