2011-07-27 98 views
1

1)我有XSD文件(I沒有控制權),我使用轉換到對象模型JAXBJAXB標註 - 從xml元素

2.提取XML值)I在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元素中提取值,但不能更改元素名稱。

我希望我有道理。

+0

您是否希望有一個對象模型映射到類似但不同的架構? –

+0

我只有1個模式,我通過JAXB轉換爲模型。也許我正在解釋這個錯誤,但我想要做的是將JAXB setter方法分配給我的數據庫字段。數據庫查詢結果將以XML格式返回給我。我在另一篇文章中被告知我需要註釋類字段以將其映射到數據庫xml結果。問題是,我只需要元素中的文本。我是否應該以不同的方式處理?也許使用DOM對象來解析我的XML並將其分配給對象模型設置器方法?請告知我需要澄清的地方。 – Hjones

回答

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); 
    } 
} 

對於更詳細的例子參見:

+1

對不起,對於最近的回覆,我是JAXB的新手,並且正在使用Netbeans環境。我正在加快EclipseLink環境並通過示例工作。這正是我需要的。謝謝! – Hjones

1

如果我理解正確,您希望以兩種不同的方式編組和解組一個對象。雖然不太適合這種情況,但您也許可以使用XmlJavaTypeAdapter。有一個tutorial here