Castor XML映射:如何用同一Java类映射不同XML字段
用同一个Java类映射不同XML字段的解决方案
当然可以搞定!你完全不用为了两种XML结构写两个重复的Person类,调整下映射配置就能让同一个类同时适配<address>和<addr>这两个标签。从你给出的配置格式来看,应该是用的Castor XML Mapping框架,下面给你两种实用的方案:
方案1:让字段同时兼容两个标签(解析两种XML都能用)
如果你的需求是同一个Person类既能解析带<address>的XML,也能解析带<addr>的XML,只需要给对应的<field>节点添加多个<bind-xml>配置就行——Castor会自动匹配XML中存在的那个标签:
<class name="Person"> <map-to xml="person" /> <field name="name" type="string"> <bind-xml name="name" node="element"/> </field> <field name="address" type="string"> <!-- 同时绑定两个标签,解析时自动匹配存在的那个 --> <bind-xml name="address" node="element"/> <bind-xml name="addr" node="element"/> </field> </class>
这样配置后,不管XML里是<address>还是<addr>,都会把对应的值赋值给Person的address属性;反过来,当你把Person对象转成XML时,默认会用第一个<bind-xml>指定的<address>标签。
方案2:按XML类型切换映射规则(更灵活)
如果你的场景是针对不同的XML文件用不同的映射规则(比如解析XML1用<address>,解析XML2用<addr>),可以做两个独立的映射配置文件,然后在代码里按需加载:
适配XML1的配置文件:
<class name="Person"> <map-to xml="person" /> <field name="name" type="string"> <bind-xml name="name" node="element"/> </field> <field name="address" type="string"> <bind-xml name="address" node="element"/> </field> </class>
适配XML2的配置文件:
<class name="Person"> <map-to xml="person" /> <field name="name" type="string"> <bind-xml name="name" node="element"/> </field> <field name="address" type="string"> <bind-xml name="addr" node="element"/> </field> </class>
然后在代码里根据要处理的XML类型,指定对应的配置:
// 处理XML1时加载第一个配置 Marshaller marshaller1 = new Marshaller(new File("xml1-output.xml")); marshaller1.setMapping(new MappingReader().readMapping(new File("mapping-for-xml1.xml"))); marshaller1.marshal(person); // 处理XML2时加载第二个配置 Marshaller marshaller2 = new Marshaller(new File("xml2-output.xml")); marshaller2.setMapping(new MappingReader().readMapping(new File("mapping-for-xml2.xml"))); marshaller2.marshal(person);
补充:如果用的是其他框架(比如JAXB)
要是你用的是JAXB而不是Castor,思路也差不多——给address字段加多个@XmlElement注解就行:
public class Person { private String name; @XmlElement(name = {"address", "addr"}) private String address; // 别忘了加getter和setter }
这样JAXB就能自动识别两种标签,不用额外写多个类。
总之,核心就是让同一个Java字段关联多个XML标签名,不同框架的实现细节略有不同,但都支持这种需求,完全没必要写重复的类~
内容的提问来源于stack exchange,提问作者jlp
相关产品推荐
相关产品推荐

