Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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
javajaxb:XML到Java对象的转换_Java_Xml_Jaxb - Fatal编程技术网

javajaxb:XML到Java对象的转换

javajaxb:XML到Java对象的转换,java,xml,jaxb,Java,Xml,Jaxb,Testdata.xml <Users> <User> <Name>Ammu</Name> <Books> <Book>book1</Book> <Book>book2</Book> <Book>book3</Book> </Book

Testdata.xml

<Users>
    <User>
        <Name>Ammu</Name>
        <Books>
            <Book>book1</Book>
            <Book>book2</Book>
            <Book>book3</Book>
        </Books>
    </User>
    <User>
        <Name>Unni</Name>
        <Books>
            <Book>book1</Book>
            <Book>book2</Book>
            <Book>book4</Book>
        </Books>
    </User>
</Users>
Book.java

import javax.xml.bind.annotation.XmlElement;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public class Book {
    private String name;

    @XmlElement(name = "Book")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this,
                ToStringStyle.MULTI_LINE_STYLE);
    }
}
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

@XmlRootElement(name = "User")
public class User {

    private String name;

    private List<Book> books = new ArrayList<Book>();

    @XmlElement(name = "Book", type = Book.class)
    public List<Book> getBooks() {
        return books;
    }

    public void setBooks(List<Book> books) {
        this.books = books;
    }

    @XmlElement(name="Name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this,
                ToStringStyle.MULTI_LINE_STYLE);
    }
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Users")
public class Users {

    @XmlElement(name = "User", type = User.class)
    private List<User> users = new ArrayList<User>();

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this,
                ToStringStyle.MULTI_LINE_STYLE);
    }

}
User.java

import javax.xml.bind.annotation.XmlElement;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public class Book {
    private String name;

    @XmlElement(name = "Book")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this,
                ToStringStyle.MULTI_LINE_STYLE);
    }
}
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

@XmlRootElement(name = "User")
public class User {

    private String name;

    private List<Book> books = new ArrayList<Book>();

    @XmlElement(name = "Book", type = Book.class)
    public List<Book> getBooks() {
        return books;
    }

    public void setBooks(List<Book> books) {
        this.books = books;
    }

    @XmlElement(name="Name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this,
                ToStringStyle.MULTI_LINE_STYLE);
    }
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Users")
public class Users {

    @XmlElement(name = "User", type = User.class)
    private List<User> users = new ArrayList<User>();

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this,
                ToStringStyle.MULTI_LINE_STYLE);
    }

}
电流输出为

com.example.Users@39b8d6f7[
  users=[com.example.User@16290fbc[
  name=Ammu
  books=[com.example.Book@144aa0ce[
  name=<null>
], com.example.Book@2f833eca[
  name=<null>
], com.example.Book@518f5824[
  name=<null>
]]
], com.example.User@61c80b01[
  name=Unni
  books=[com.example.Book@19e3cd51[
  name=<null>
], com.example.Book@3abc8e1e[
  name=<null>
], com.example.Book@311671b2[
  name=<null>
]]
]]
输出:

com.example.Users@3882764b[
  users=[com.example.User@7d2452e8[
  name=Ammu
  books=[com.example.Book@6860991f[
  name=book1
], com.example.Book@1de4f7c2[
  name=book2
], com.example.Book@2345f0e3[
  name=book3
]]
], com.example.User@5bbf3d87[
  name=Unni
  books=[com.example.Book@44c9d92c[
  name=book1
], com.example.Book@1fd0fafc[
  name=book2
], com.example.Book@510dc6b5[
  name=book4
]]
]]
]
与其他地方的示例相比,这是一个稍微不同的用例。谢谢大家,布莱斯·道格汉

测试启动

public static void main(String[] args) {
        try {
            File file = new File("C:\\temp\\testdata.xml");
            JAXBContext jaxbContext = JAXBContext.newInstance(Users.class);
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            Users users = (Users) jaxbUnmarshaller.unmarshal(file);
            System.out.println(users);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

在使用数组时,例如在您的用户示例中,您使用@XmlRootElement(name=“Users”)进行映射,但是对于Books,没有@XmlElement(name=“Books”,type=Book.class),您只是映射“Book”

试着放:

@XmlElement(name = "Books", type = Book.class)
而不是:

@XmlElement(name = "Book", type = Book.class)

您需要为您的用例利用
@xmlementwrapper
注释:

@XmlElementWrapper(name="Books")
@XmlElement(name = "Book")
public List<Book> getBooks() {
    return books;
}
如果没有它,预期的XML是:

<User>
    <Book>...</Book>
    <Book>...</Book>
</User>

User.java
中,注释不应该是
@xmlement(name=“Books”,type=Book.class)
(带s的书)我尝试过这个,现在o/p结构略有不同,即它拉1本空名字的书<代码>com.example。Users@4e76fba0[users=[com.example。User@6581ed9e[name=Ammu books=[com.example]。Book@e949f69[name=]],com.example。User@35175422[name=Unni books=[com.example]。Book@3f6dadf9[name=]]]谢谢Blaise Doughan,
@xmlementwrapper
肯定是缺少的+1。现在,这个程序正试图把这三个人拉进书中。但是值是空的。java中有什么错误吗?我将在问题部分发布当前的o/p作为update@prash-在
书籍
类中的
名称
属性上查看我关于使用
@XmlValue
的更新。就是这样。非常感谢布莱斯·道格汉。
<User>
    <Book>...</Book>
    <Book>...</Book>
</User>
public class Book {
    private String name;

    @XmlValue
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}