【问题标题】:Parse a string with multiple XML-like tags using Ruby使用 Ruby 解析具有多个类似 XML 的标签的字符串
【发布时间】:2015-07-03 06:07:11
【问题描述】:

我有一个如下所示的字符串:

   string = " <SET-TOPIC>INITIATE</SET-TOPIC>

    <SETPROFILE>
      <PROFILE-KEY>predicates_live</PROFILE-KEY>
      <PROFILE-VALUE>yes</PROFILE-VALUE>
    </SETPROFILE>

    <think>
      <set><name>first_time_initiate</name>yes</set>
    </think>

    <SETPROFILE>
      <PROFILE-KEY>first_time_initiate</PROFILE-KEY>
      <PROFILE-VALUE>YES</PROFILE-VALUE>
    </SETPROFILE>"

我的目标是能够通过解析读出每个大写的顶层。我使用case 语句来评估什么是顶级键,例如&lt;SETPROFILE&gt;,但可以有很多不同的值,然后运行一个方法,对标签的内容执行不同的操作。

这意味着我需要能够非常容易地知道:

  • top_level_keys = ['SET-TOPIC', 'SET-PROFILE', 'SET-PROFILE']
  • 当我传入密钥时,知道完整值
  • parsed[0].value = {:PROFILE-KEY =&gt; predicates_live, :PROFILE-VALUE =&gt; yes}
  • parsed[0].key = ['SET-TOPIC']

我目前解析整个字符串如下:

doc = Nokogiri::XML::DocumentFragment.parse(string)
parsed = doc.search('*').each_with_object({}){ |n, h|
  h[n.name] = n.text
}

因此,我只解析并知道第二个标签。第一个标记中的值不会显示在 parsed 变量中。

如果有帮助,我可以控制标签是什么。

但是我需要能够解析并知道两个标签的内容作为解析的结果,因为我需要为节点的每个实例应用一个方法。

注意:字符串也只包含常规文本,包括在类似 XML 的标记之前、中间和之后。

【问题讨论】:

    标签: ruby xml parsing nokogiri


    【解决方案1】:

    这取决于您要实现的目标。问题是您正在用新值覆盖哈希键。收集值最简单的方法是将它们存储在数组中:

    parsed = doc.search('*').each_with_object({}) do |n, h| 
      # h[n.name] = n.text :: removed because it overrides values
      (h[n.name] ||= []) << n.text 
    end
    

    【讨论】:

    • 谢谢。如果我们删除覆盖并创建一个数组就可以了。这样做有缺点或权衡吗?
    • 我的目标是能够拥有一种可以解析每个不同标签并应用该方法的方法。然后不同的节点获取解析后的值,应用适当的方法,然后从字符串中剥离标签或根据方法替换它。
    • 我收到一个错误:TypeError: no implicit conversion of Symbol into Integer 我们是否将哈希转换为数组?
    • 我想我想通了——但重点可以追溯到您最初的问题,即我想要实现的目标。让我更新一下描述。
    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多