2012-07-10 146 views
2

我無法查找元素的查找屬性值。我的XML是使用XStream讀取元素屬性值

<Person> 
      <BirthDate>2008-01-04</BirthDate> 
      <FirstName>Affo</FirstName> 
      <Gender tc="200">Male</Gender> 
      <LastName></LastName> 
      <Occupation>false</Occupation> 
      <Age>4</Age> 
</Person> 

我對<Gender tc="200">Male</Gender>感興趣。我的POJO看起來是這樣的:

private String FirstName; 
    private String LastName; 
    private String Occupation; 
    @XStreamAsAttribute 
    @XStreamAlias("tc") 
    private String genderTC; 
    private String Gender; 
    private String birthDate; 
    private int age; 

從XML是

  XStream stream = new XStream(new DomDriver()); 
     stream.processAnnotations(PersonType.class); 
     PersonType person = (PersonType) stream.fromXML(file); 

     System.out.println(person.getFirstName()); 
     System.out.println(person.getGenderTC()); 
     System.out.println(person.getGender()); 

這裏person.getGenderTC()我得到空。有趣的是,當我逆轉的過程和產生使用相同PersonType POJO的XML,我得到了下面的XML:

<Person tc="111"> 
    <FirstName>Himanshu</FirstName> 
    <Gender>M</Gender> 
    <Age>28</Age> 
</Person> 
+0

退房節 「將對象映射到簡單的內容」:HTTP ://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-xstream.html – 2012-07-10 17:34:15

+0

@BlaiseDoughan但是我又一次需要創建一個單獨的類來獲取內部屬性。對? – 2012-07-10 17:43:42

+0

是的,如果您對使用EclipseLink MOXy感興趣,我可以告訴您如何在不引入單獨課程的情況下關閉它。 – 2012-07-10 17:50:34

回答

3

@BlaiseDoughan很棒,我感謝您的支持。您能否告訴我如何在不使用jaxb.properties的情況下將EclipseLink MOXy與我的項目 集成?什麼是圖書館/ JARs包括? 在我知道EclipseLink JAXB(MOXy)實現獲得 屬性之間。我唯一的預感是jaxb.properties文件。

下面是你如何使用莫西的@XmlPath註釋做你正在尋找的映射:

package forum11417620; 

import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement(name="Person") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Person { 

    @XmlElement(name="FirstName") 
    private String firstName; 

    @XmlElement(name="LastName") 
    private String lastName; 

    @XmlElement(name="Occupation") 
    private String occupation; 

    @XmlPath("Gender/@tc") 
    private String genderTC; 

    @XmlPath("Gender/text()") 
    private String gender; 

    @XmlElement(name="BirthDate") 
    private String birthDate; 

    @XmlElement(name="Age") 
    private int age; 

} 

演示

下面是一個例子如何在沒有的情況下引導MOXy 文件。

package forum11417620; 

import java.io.File; 
import javax.xml.bind.*; 
import org.eclipse.persistence.jaxb.JAXBContextFactory; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContextFactory.createContext(new Class[] {Person.class}, null); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum11417620/input.xml"); 
     Person person = (Person) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(person, System.out); 
    } 

} 

input.xml中/輸出

<?xml version="1.0" encoding="UTF-8"?> 
<Person> 
    <FirstName>Affo</FirstName> 
    <LastName></LastName> 
    <Occupation>false</Occupation> 
    <Gender tc="200">Male</Gender> 
    <BirthDate>2008-01-04</BirthDate> 
    <Age>4</Age> 
</Person> 

必需二進制(從http://www.eclipse.org/eclipselink/downloads/

選項#1 - 的EclipseLink JAR(從安裝郵編)

  • eclipselink。罐子

選項#2 - MOXY束(從OSGi軟件包郵編)

  • org.eclipse.persistence.moxy.jar
  • org.eclipse.persistence.core.jar
  • org.eclipse.persistence.asm.jar

Maven的

我有例如pom.xml文件上的Git樞紐作爲從我的博客一些例子部分:

+0

感謝您的回覆。我能夠完美地運行它。我發現Eclipse Link也支持JPA。最終,我使用Hibernate將此POJO保存到數據庫中。你可以請參考相同的教程嗎? – 2012-07-11 00:56:13

+0

@HimanshuYadav - 我有以下JPA相關教程:http://blog.bdoughan.com/search/label/JPA。我會建議使用標準的JPA API,因爲這將允許您在日後根據需要交換JPA提供程序。 – 2012-07-11 17:11:29

2

當你擁有了它,這樣的代碼:

@XStreamAsAttribute 
@XStreamAlias("tc") 
private String genderTC; 

期待的屬性tc到位於XML的附件Person節點上。

我認爲您需要定義第二個pojo類型來反序列化Gender數據,包括genderTC屬性以及Gender元素。

+0

是嗎?我有成千上萬的元素只有一個屬性。有沒有其他的方式來做到這一點,使用轉換器或XPath的東西。 – 2012-07-10 16:43:35

+0

ToAttributedValueConverter是一個可能的解決方案,根據這個問題:http://stackoverflow.com/questions/16460810/how-to-read-list-elements-with-attribute-via-xstream(雖然它確實需要每個克里斯兒童POJO '評論)。儘管爲了最小化影響,您可以將孩子的POJO作爲Person類的內部類。 – 2015-04-08 12:28:49