Разобрать блочно сгенерированный код XML для объектов Java

Я должен разобрать блочно сгенерированный код XML. Обычно я использую парсер Xstream для разбора XML. Но синтаксический анализатор XStream не работает, так как этот XML имеет дочерние теги с тем же именем, что и родительский тег. Я нашел эту библиотеку, которая преобразовывает код Blockly xml в объекты Java. Но эта библиотека не работает для сложного блочного XML-кода, показанного ниже. Я попытался отредактировать библиотеку, чтобы включить разбор для приведенного ниже XML-кода. Но это не работает.

<?xml version="1.0" encoding="UTF-8"?>
<block type="event_click" id="Bp64nx|xcR*L:(K(`u78" x="146" y="81">
   <field name="Event_Type">none</field>
   <field name="do_on_page_load">TRUE</field>
   <statement name="action">
      <block type="database_yes_no" id="@0OCYIX:}@uT?0[UbS=r">
         <value name="Check_Name">
            <block type="database_check_field" id="Sl-IEwB~/hv?9mQYYBB]">
               <field name="Enum_Name">StockType</field>
               <field name="Enum_Value">Serialised</field>
            </block>
         </value>
         <statement name="Yes">
            <block type="action_toggle_field" id="}X:#xcfp,!+bk7MA.sgJ">
               <field name="action">show</field>
               <field name="id">4930</field>
               <next>
                  <block type="action_toggle_field" id="h)QgD#prJCVcm;BMG$VR">
                     <field name="action">hide</field>
                     <field name="id">4932</field>
                     <next>
                        <block type="action_toggle_field" id="1V{g?Cdh2ww}ihWhtovG">
                           <field name="action">show</field>
                           <field name="id">4961</field>
                        </block>
                     </next>
                  </block>
               </next>
            </block>
         </statement>
         <statement name="No">
            <block type="action_toggle_field" id="InDTOg;B2!go_rD;WIb~">
               <field name="action">hide</field>
               <field name="id">4930</field>
               <next>
                  <block type="action_toggle_field" id="f{Ae_|^jEb{CR5$?9Ku.">
                     <field name="action">show</field>
                     <field name="id">4932</field>
                     <next>
                        <block type="action_toggle_field" id="@-^o/f|Iv0WIids+VcJv">
                           <field name="action">hide</field>
                           <field name="id">4961</field>
                        </block>
                     </next>
                  </block>
               </next>
            </block>
         </statement>
      </block>
   </statement>
</block>

Я не вижу большой помощи при разборе Blockly xml.

Пожалуйста, дайте мне знать, если есть решение или библиотека для анализа блочно сгенерированного кода XML.

Спасибо.

1 ответ

Анализаторы XML на основе потоков требуют от вас поддержания дополнительного состояния, обычно стека. просто if (tagName == 'block') {...} недостаточно

Для приведенного выше примера стек может выглядеть следующим образом:

block
statement
block
statement
block
next
block
next
block
field

Каждый элемент может иметь указатель на анализируемый объект, находящийся в процессе разработки, так что вы можете добавить к нему дочерний элемент и узнать, над каким объектом продолжать работать после конечного тега.

Хотя он использует XmlPullParser вместо потокового парсера, вы можете посмотреть на com.google.blockly.model.BlockFactory.fromXml(..) в blockly-android Сделки РЕПО.

Другие вопросы по тегам