Как подсчитать конкретные узлы в строке XML, используя Ruby? - PullRequest
1 голос
/ 31 октября 2019

У меня есть такая строка:

text = <<-XML
  <?xml version="1.0" encoding="UTF-8" ?>
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

    <url>
      <loc>https://www.my9.jp/LanLT/index.cfm?fuseaction=job.detail&amp;sgtno=Job-000002</loc>
      <lastmod>2019-10-04</lastmod>
      <changefreq>daily</changefreq>
      <priority>0.8</priority>
    </url>

    <url>
      <loc>https://www.my9.jp/LanLT/index.cfm?fuseaction=job.detail&amp;sgtno=samnangtest002</loc>
      <lastmod>2019-10-01</lastmod>
      <changefreq>daily</changefreq>
      <priority>0.8</priority>
    </url>

    <url>
      <loc>https://www.my9.jp/LanLT/index.cfm?fuseaction=job.detail&amp;sgtno=Job-000006</loc>
      <lastmod>2019-10-04</lastmod>
      <changefreq>daily</changefreq>
      <priority>0.8</priority>
    </url>
  </urlset>
XML

Я хочу подсчитать количество подстрок, которые начинаются с <url> и заканчиваются </url>. Например, в этой строке результат равен 3.

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Используйте правильный инструмент для работы. Инструмент для анализа данных HTML или XML - Nokogiri

require 'nokogiri'

count = Nokogiri::XML.parse(text).root.children.count {|node| node.name == "url" }

Если вы хотите вычислить также все <url> узлы у внуков (рекурсивно), тогда попробуйте метод traverse (метод регулярных выражений)не будет работать в этом случае)

count = 0
Nokogiri::XML.parse(text).traverse { |node| count += 1 if node.name == "url" }

puts count # => 3

Вы не должны использовать регулярные выражения для анализа XML-данных. Regex не был разработан для этого и подвержен ошибкам.

1 голос
/ 31 октября 2019
text.scan(/<url>.*?<\/url>/m).size

m обозначает многострочное.

Шаблон регулярного выражения ищет материал, окруженный <url> и </url>.

...