Jaxb Annotations - 从xml元素中提取xml值

时间:2011-07-27 02:37:28

标签: java annotations jaxb

1。)我有一个XSD文件(我无法控制),我使用JAXB转换为对象模型

2.。)我有一个XML格式的数据库提取。 XML元素标记名称严格地是表的字段名称

3.)我使用注释将xml元素映射到Java类。

问题:有没有办法在XSD文件中维护元素名称,并且只能提取xml元素的值。

JAXB注释类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Item", propOrder = {
    "code",
    "name",
    "price"
})
@XmlRootElement(name="inventory")
public class Item {

    @XmlElement(name="catalog_num", required = true)
    protected String code;

    @XmlElement(name="catalog_descrip", required = true)
    protected String name;

    @XmlElement(name="prod_price")
    protected double price;


    public String getCode() {
        return code;
    }
//etc

数据库xml文件的摘录:

<?xml version="1.0"?>
<inventory>
          <catalog_num>I001</catalog_num>
          <catalog_descrip>Descriptive Name of Product</catalog_descrip>
          <prod_price>11200</prod_price>
</inventory>

编组上述xml文件后我需要得到的结果是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Item>
    <code>I001</code>
    <name>Descriptive Name of Product</name>
    <price>11200.0</price>
</Item>

在上面的代码中,我尝试了注释方法而不是字段,但是我得到了相同的结果。我只想从xml元素中提取值,但不要更改元素名称。

我希望我有意义。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你会想要以两种不同的方式编组和解组一个对象。虽然不是它的预期用途,但您可能可以使用XmlJavaTypeAdapter。有tutorial here

答案 1 :(得分:1)

注意:我是EclipseLink JAXB (MOXy)负责人,也是JAXB(JSR-222)专家组的成员。

MOXy提供了一个扩展,您可以通过XML文档应用第二个XML绑定。此绑定文档可用于添加元数据,或者xml-mapping-metadata-complete="true"完全替换Java模型上的JAXB注释提供的元数据;

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum6838882" 
    xml-mapping-metadata-complete="true">
    <java-types>
        <java-type name="Item" xml-accessor-type="FIELD">
            <xml-root-element name="Item"/>
        </java-type>
    </java-types>
</xml-bindings>

绑定文件在创建JAXBContext时作为参数传递:

Map<String, Object> properties = new HashMap<String, Object>();
properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum6838882/binding.xml");
JAXBContext resultJC = JAXBContext.newInstance(new Class[] {Item.class}, properties);

要解决您的问题,您可以创建一个JAXBContext来处理数据库文档(使用带注释的类),并创建第二个JAXBContext来使用MOXy绑定文件处理结果格式。以下是它的外观:

package forum6838882;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import org.eclipse.persistence.jaxb.JAXBContextFactory;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext databaseJC = JAXBContext.newInstance(Item.class);
        Unmarshaller databaseUnmarshaller = databaseJC.createUnmarshaller();
        File databaseXML = new File("src/forum6838882/database.xml");
        Item item = (Item) databaseUnmarshaller.unmarshal(databaseXML);

        Map<String, Object> properties = new HashMap<String, Object>();
        properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum6838882/binding.xml");
        JAXBContext resultJC = JAXBContext.newInstance(new Class[] {Item.class}, properties);
        Marshaller resultMarshaller = resultJC.createMarshaller();
        resultMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        resultMarshaller.marshal(item, System.out);
    }
}

更详细的示例请参阅: