Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 解析ul和ol中的嵌套li_Ruby On Rails_Ruby_Ruby On Rails 4_Html Lists_Nokogiri - Fatal编程技术网

Ruby on rails 解析ul和ol中的嵌套li

Ruby on rails 解析ul和ol中的嵌套li,ruby-on-rails,ruby,ruby-on-rails-4,html-lists,nokogiri,Ruby On Rails,Ruby,Ruby On Rails 4,Html Lists,Nokogiri,我有一个场景,当li在ul下时,我需要用一个点(.)替换它,当li在ol下时,我需要用一个数字替换它 但问题是- 1) 这对我来说是行不通的 2) 它是在同一级别追加的。同一级别意味着一旦找到li,它将首先添加点(.),然后添加数字 我想要什么 1) 每当li进入ul时,应添加点(.) 2) 每当李进入ol时,它应该添加一个数字 data = "<ol>\n<li>Introduction\n<ol>\n<li>hyy ssss</li>

我有一个场景,当li在ul下时,我需要用一个点(.)替换它,当li在ol下时,我需要用一个数字替换它

但问题是-

1) 这对我来说是行不通的

2) 它是在同一级别追加的。同一级别意味着一旦找到li,它将首先添加点(.),然后添加数字

我想要什么

1) 每当li进入ul时,应添加点(.)

2) 每当李进入ol时,它应该添加一个数字

data = "<ol>\n<li>Introduction\n<ol>\n<li>hyy ssss</li>\n</ol>\n</li>\n<li>Description</li>\n<li>Observation</li>\n<li>Results</li>\n<li>Summary</li>\n</ol>\n<ul>\n<li>Introduction</li>\n<li>Description\n<ul>\n<li>Observation\n<ul>\n<li>Results\n<ul>\n<li>Summary</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>Overview</li>\n</ul>\n<p>All the testing regarding bullet points would have been covered with the above content. Hence publishing this content will make an entry in in the selected  page, cricket page and so on.</p>\n"

    content = Nokogiri::HTML.parse(data)
    content.at('ul').children.xpath("//li").each { |li| li.inner_html="\u2022 "+li.inner_html }
    content.at('ol').children.xpath("//li").each_with_index { |li,index| li.inner_html="#{index} "+li.inner_html }
数据="\n\n
content=Nokogiri::HTML.parse(数据)
content.at('ul').children.xpath(//li”).each{li | li.inner_html=“\u2022”+li.inner_html}
content.at('ol').children.xpath(//li”)。每个_都带有_索引{li,索引{li.inner_html=“#{index}”+li.inner_html}
也许您需要:

content.css('ol').reverse.each do |ol| 
  ol.css('> li').each_with_index { |li,index| li.inner_html="#{index + 1} "+li.inner_html }
end
content.css('ul > li').reverse.each { |li| li.inner_html="\u2022 "+li.inner_html }

puts content

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<ol>
  <li>1 Introduction
    <ol>
      <li>1 hyy ssss</li>
    </ol>
  </li>
  <li>2 Description</li>
  <li>3 Observation</li>
  <li>4 Results</li>
  <li>5 Summary</li>
</ol>
<ul>
  <li>• Introduction</li>
  <li>• Description
    <ul>
      <li>• Observation
        <ul>
          <li>• Results
            <ul>
              <li>• Summary</li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
  <li>• Overview</li>
</ul>
</body></html>
当你做
content.css('ul>li')
时,你得到的顺序是[描述,观察]。如果没有
反向
,当您运行代码段时,您会更改描述,但这样做也会更改观察节点的
对象id
。然后您更改了在
内容
中未被引用的观察节点。这就是为什么,我将其反向,并在家长之前获得了
子对象s、 我确保先更改子节点,然后更改父节点,以便父节点知道子节点中的更改,并且没有未引用的节点

假设描述的节点id为1234,观察节点id为2345。当你改变描述时,它改变了自己,但也改变了它的子节点(2345)。新对象id可以分别为3456和4567。然后你改变了2345(通过迭代),但没有效果,因为你的
内容
显示3456->4567


希望这是有意义的。

此外,当我们嵌入标记时,您能为每个级别添加空格吗?@ankur补充了这一点作为解释。我将进一步建议您使用节点的
对象id
,以获得更清晰的效果。
<ul>
  <li>Description
    <ul>
      <li>Observation</li>
    </ul>
  </li>
</ul>