我要解析Blockly生成的XML代码。通常我使用Xstream解析器来解析XML。但是XStream解析器无法正常工作,因为此XML具有与Parent标记相同的子标记。我找到了this库,它将Blockly xml代码转换为Java对象。但是这个库对于下面显示的Complex Blockly 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解析没有太多帮助。
如果有解析Blockly生成的XML代码的解决方案或库,请告诉我。
谢谢。
基于流的XML解析器要求您维护额外的状态,通常是堆栈。简单的if (tagName == 'block') {...}
是不够的。
对于上面的示例,堆栈可能如下所示:
block
statement
block
statement
block
next
block
next
block
field
每个项目可能都有一个指向正在构建的已解析对象的指针,因此您可以将子项添加到其中,并知道在结束标记之后要继续处理的对象。
虽然它使用XmlPullParser而不是流解析器,但您可能需要查看com.google.blockly.model.BlockFactory.fromXml(..)
repo中的blockly-android
。