Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jaxb注释-从xml元素提取xml值_Java_Annotations_Jaxb - Fatal编程技术网

Java Jaxb注释-从xml元素提取xml值

Java Jaxb注释-从xml元素提取xml值,java,annotations,jaxb,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"

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元素中提取值,但不想更改元素名称


我希望我说的有道理。

如果我理解正确,您希望以两种不同的方式封送和解封送对象。虽然不完全是预期的情况,但您可能可以使用一个。有一个。

注意:我是负责人,也是JAXB()专家组的成员

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);
Map properties=newhashmap();
put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY,“forum6838882/binding.XML”);
JAXBContext resultJC=JAXBContext.newInstance(新类[]{Item.Class},属性);
为了解决您的问题,您可以创建一个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);
    }
}
用于UM6838882的包;
导入java.io.File;
导入java.util.HashMap;
导入java.util.Map;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.Marshaller;
导入javax.xml.bind.Unmarshaller;
导入org.eclipse.persistence.jaxb.JAXBContextFactory;
公开课演示{
公共静态void main(字符串[]args)引发异常{
JAXBContext数据库jc=JAXBContext.newInstance(Item.class);
Unmarshaller databaseUnmarshaller=databaseJC.createUnmarshaller();
File databaseXML=新文件(“src/forum6838882/database.xml”);
Item=(Item)databaseUnmarshaller.unmarshal(databaseXML);
映射属性=新的HashMap();
put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY,“forum6838882/binding.XML”);
JAXBContext resultJC=JAXBContext.newInstance(新类[]{Item.Class},属性);
Marshaller resultMarshaller=resultJC.createMarshaller();
setProperty(Marshaller.JAXB_格式化的_输出,true);
resultMarshaller.Marshall(项目,系统输出);
}
}
有关更详细的示例,请参见:


您是否希望将一个对象模型映射到类似但不同的模式?我只有一个通过JAXB转换为模型的模式。也许我的解释是错误的,但我试图做的基本工作是将JAXB setter方法分配给我的数据库字段。数据库查询结果将以XML格式返回给我。我在另一篇文章中被告知,我需要注释类字段以将其映射到数据库xml结果。问题是,我只需要元素中的文本。我是否应该换一种方式来处理这个问题?也许可以使用DOM对象来解析XML并将其分配给对象模型设置器方法?请告知我需要澄清的地方。很抱歉,我没有及时回复,我是JAXB新手,正在使用Netbeans环境。我正在学习EclipseLink环境的最新知识,并通过示例进行工作。这正是我需要的。谢谢
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);
    }
}