【问题标题】:How to use Moxy to parse xml attributes as key value如何使用 Moxy 将 xml 属性解析为键值
【发布时间】:2018-02-16 21:51:58
【问题描述】:

我正在尝试使用 MOXy 解析以下 xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dml>
<dml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<content>
<entry>
      <namespace>
        <meta property="abc" content="abcd" />
        <meta property="xyz" content="xyzd" />
      </namespace>
    </entry>
    <entry>
      <namespace>
        <meta property="abc" content="pqr" />
        <meta property="xyz" content="xyzd" />
        <meta property="lmn" content="qwert" />
      </namespace>
    </entry>
</content>
</dml>

我想将元素“元”的属性“属性”和“内容”解析为键值对。

我使用了以下链接,但没有运气。元地图对我来说是空的。 http://blog.bdoughan.com/2013/06/moxys-xmlvariablenode-using-maps-key-as.html

这是我的课程。

  public static void parseDml(String dmlXmlFile) throws Exception {  

    DMLData dmlData = null;
    try 
    {
      JAXBContext jaxbContext = JAXBContext.newInstance(DMLData.class);
      unmarshaller = jaxbContext.createUnmarshaller();

      dmlData = (DMLData) unmarshaller.unmarshal(new File(dmlXmlFile));

      Marshaller marshaller = jaxbContext.createMarshaller();
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
      marshaller.marshal(dmlData, System.out);
    }
    catch (Exception e)
    {
      throw new Exception("Error while unmarshalling dml XML : " + e);
    }

  }

DMLData.java

@Getter
@NoArgsConstructor
@XmlRootElement(name = "dml")
@XmlAccessorType(XmlAccessType.FIELD)
public class DMLData
{

  @XmlPath("content/entry")
  private List<Entry> entry;


}

Entry.java

@XmlRootElement(name = "entry")
@Getter
@XmlAccessorType(XmlAccessType.FIELD)
public class Entry
{

  @XmlPath("namespace/meta")
  @XmlJavaTypeAdapter(MapAdapter.class)
  private Map<String, String> map = new HashMap<String, String>();

}

元.java

@XmlRootElement(name = "boeXmlMeta")
@Getter
@XmlAccessorType(XmlAccessType.FIELD)
public class Meta
{

  private Map<String, String> boeXmlMeta = new HashMap<String, String>();

  @XmlPath("@property")
  private String property;

  @XmlPath("@content")
  private String content;

  public void setProperty(String model)
  {
    this.property = property;
  }

  public void setContent(String content)
  {
    this.content = content;
  } 
}

MapAdapter.java

public class MapAdapter extends XmlAdapter<List<Meta>,HashMap<String,String>> {


  @Override
  public ArrayList<Meta> marshal(HashMap<String, String> map) throws Exception {
    ArrayList<Meta> list = new ArrayList<Meta>();
      for(Entry<String, String> entry : map.entrySet()) {
          Meta Meta = new Meta();
          Meta.setProperty(entry.getKey());
          Meta.setContent(entry.getValue());
          list.add(Meta);
      }
      return list;
  }

  @Override
  public HashMap<String, String> unmarshal(List<Meta> MetaList) throws Exception {
      HashMap<String, String> map = new HashMap<String, String>(MetaList.size());
      for(Meta Meta : MetaList)
      {
        map.put(Meta.getProperty() ,Meta.getContent());
      }
      return map;
  }

}

这是我得到的输出:

<?xml version="1.0" encoding="UTF-8"?>
<dml>
   <content>
      <entry/>
      <entry/>
   </content>
</dml>

任何帮助将不胜感激。

【问题讨论】:

    标签: jaxb eclipselink pojo moxy


    【解决方案1】:

    我认为不需要XmlPath,旧的XmlElementXmlAttribute 就可以了。

    Entry.java:

    @XmlElement(name = "namespace")
    @XmlJavaTypeAdapter(MapAdapter.class)
    private Map<String, String> map = new HashMap<>();
    

    元.java:

    @XmlAttribute(name = "property")
    private String property;
    
    @XmlAttribute(name = "content")
    private String content;
    

    MapAdapter.java:

    public class MapAdapter extends XmlAdapter<Namespace, Map<String, String>> {
    
        @XmlRootElement(name = "meta")
        @XmlAccessorType(XmlAccessType.FIELD)
        public static class Namespace {
    
            @XmlElement(name = "meta")
            private List<Meta> metas;
    
            public Namespace() {
            }
    
            public Namespace(List<Meta> list) {
                metas = list;
            }
    
            public List<Meta> getMetas() {
                return metas;
            }
    
        }
    
        @Override
        public Namespace marshal(Map<String, String> map) throws Exception {
            List<Meta> list = new ArrayList<>();
            for (Map.Entry<String, String> entry : map.entrySet()) {
                Meta meta = new Meta();
                meta.setProperty(entry.getKey());
                meta.setContent(entry.getValue());
                list.add(meta);
            }
            return new Namespace(list);
        }
    
        @Override
        public Map<String, String> unmarshal(Namespace metaList) throws Exception {
            Map<String, String> map = new HashMap<>();
            for (Meta meta : metaList.metas) {
                map.put(meta.getProperty(), meta.getContent());
            }
            return map;
        }
    
    }
    

    我在这里添加了另一个帮助类来描述Namespace

    【讨论】:

      猜你喜欢
      • 2017-11-25
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多