Разбор рекурсивного сбора глубокой вложенной категории XML-детей с идентификаторами родителей - PullRequest
0 голосов
/ 03 мая 2019

У меня есть XML-файл, как с атрибутами id и name.

    <?xml version="1.0" encoding="UTF-8"?>
     <product_categories>
       <product_category id="409" name="Computer">
          <product_category id="414" name="Server">
             <product_category id="511" name="Multimedia Server"/>
          </product_category>
          <product_category id="1645" name="Server Equips"/>
       </product_category>
       <product_category id="97" name="Computer Equips">
          <product_category id="127" name="Adaptor">
             <product_category id="133" name="Audior"/>
             <product_category id="128" name="DVI"/>
             <product_category id="134" name="Firewire"/>
             <product_category id="135" name="Gender Changer"/>
             <product_category id="129" name="HDMI - DVI / DVI-I"/>
             <product_category id="137" name="HDMI"/>
             <product_category id="139" name="Keyboard"/>
             <product_category id="141" name="Mouse"/>
             <product_category id="144" name="Scart"/>
             <product_category id="196" name="Serial"/>
             <product_category id="198" name="SUN KVM"/>
             <product_category id="147" name="USB Adap">
                <product_category id="743" name="USB Adap"/>
                <product_category id="1040" name="USB Şarj Adap"/>
                <product_category id="1088" name="USB C Adap"/>
                <product_category id="1611" name="USB Seri Adap"/>
                <product_category id="1612" name="USB Ethernet Adap"/>
             </product_category>
            </product_category>
          </product_category>
       </product_category>
    </product_categories>

Я хочу составить список всех детей с идентификаторами родителей и родителей с самоидентификацией. Пример:


    Computer, [409]
      Server, [409,414]
        Multimedia Server, [409,414,511]
    Computer Equips, [97]
      Adaptor, [97,127]
        Audior, [97,127,133]
        ...
        ...
          USB Adap, [97,127,147,743]

Я пытаюсь решить свою проблему неделями, но не могу найти решение? Как я могу рекурсивно анализировать и конвертировать таким образом, используя ruby ​​и nokogiri? Любое предложение.

1 Ответ

1 голос
/ 03 мая 2019

Это должно сработать. Он просто перебирает все узлы «product_category». Для каждого узла он получает идентификаторы предков, а затем печатает имена и идентификаторы.

doc = Nokogiri::XML(open('test.xml'))
doc.search('product_category').each do |node|
  # get the current node's ID
  id = node.attr('id')

  # get all ancestor node IDs
  ancestor_ids = node.ancestors('product_category').map { |anode| anode.attr('id') }

  # put all the node IDs into an array
  all_ids = ([id] + ancestor_ids).reverse

  # output node name with all IDs and prepend spaces based on number of ancestors
  puts "#{'  ' * ancestor_ids.size}#{node.attr('name')}, [#{all_ids.join(', ')}]"
end

Вывод:

Computer, [409]
  Server, [409, 414]
    Multimedia Server, [409, 414, 511]
  Server Equips, [409, 1645]
Computer Equips, [97]
  Adaptor, [97, 127]
    Audior, [97, 127, 133]
    DVI, [97, 127, 128]
    Firewire, [97, 127, 134]
    Gender Changer, [97, 127, 135]
    HDMI - DVI / DVI-I, [97, 127, 129]
    HDMI, [97, 127, 137]
    Keyboard, [97, 127, 139]
    Mouse, [97, 127, 141]
    Scart, [97, 127, 144]
    Serial, [97, 127, 196]
    SUN KVM, [97, 127, 198]
    USB Adap, [97, 127, 147]
      USB Adap, [97, 127, 147, 743]
      USB Şarj Adap, [97, 127, 147, 1040]
      USB C Adap, [97, 127, 147, 1088]
      USB Seri Adap, [97, 127, 147, 1611]
      USB Ethernet Adap, [97, 127, 147, 1612]
...