将生成的XML代码解析为Java对象

时间:2018-12-03 14:29:05

标签: java android xml-parsing blockly

我必须解析Blockly生成的XML代码。通常,我使用Xstream解析器解析XML。但是XStream解析器不起作用,因为此XML具有与父标记同名的子标记。 我发现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代码。

谢谢。

1 个答案:

答案 0 :(得分:1)

基于流的XML解析器要求您维护额外的状态,通常是堆栈。简单的import React, { useState } from "react"; import styled from "styled-components"; import posed from "react-pose"; const Container = styled.div` font-family: "Baumans"; font-size: 220px; display: flex; cursor: pointer; `; const Up = styled.div` color: #81d6e3; `; const Four = styled.div` color: #ff101f; `; const Fours = styled.div` display: flex; `; const MirroredFour = posed.div({ unhovered: { transform: "rotateY(0deg)" }, hovered: { transform: "rotateY(180deg)", transition: { type: "tween", duration: 2000 } } }); const SecondFour = styled(MirroredFour)` color: #FF101F position: absolute; transform-origin: 67%; `; const UpFor = () => { const [hovering, setHovering] = useState(false); console.log("hovering", hovering); return ( <Container onMouseEnter={() => { setHovering(true); }} onMouseLeave={() => { setHovering(false); }} > <Up>Up</Up> <Fours> <Four>4</Four> <SecondFour pose={hovering ? "hovered" : "unhovered"}>4</SecondFour> </Fours> </Container> ); }; export default UpFor; 是不够的。

对于您上面的示例,堆栈可能如下所示:

if (tagName == 'block') {...}

每个项目可能都有一个指向正在构造的已解析对象的指针,因此您可以向其添加子对象,并在结束标记后知道要继续处理的对象。

虽然它使用XmlPullParser而不是流解析器,但您可能希望查看com.google.blockly.model.BlockFactory.fromXml(..)存储库中的blockly-android

相关问题