Java 如何在JAXB中封送具有不同值的多组对象?
我试图整理出标签不断变化的标签。我不断覆盖对象值,并在封送处理时为标记使用相同的值 期望输出:Java 如何在JAXB中封送具有不同值的多组对象?,java,xml,object,jaxb,marshalling,Java,Xml,Object,Jaxb,Marshalling,我试图整理出标签不断变化的标签。我不断覆盖对象值,并在封送处理时为标记使用相同的值 期望输出: <bookshelf> <shelfnumber> 001 </shelfnumber> <shelfowner> John Snow </shelfowner> <book> <Author>Ned Stark</Author> <Chapters&
<bookshelf>
<shelfnumber> 001 </shelfnumber>
<shelfowner> John Snow </shelfowner>
<book>
<Author>Ned Stark</Author>
<Chapters>24</Chapters>
<Chapter1>.......</Chapter1>
<Chapter2>.......</Chapter2>
</book>
<book>
<Author>Rob Stark</Author>
<Chapters>24</Chapters>
<Chapter1>.......</Chapter1>
<Chapter2>.......</Chapter2>
</book>
<magazine>
<Author>Tyrion Lannister</Author>
<Pages>24</Pages>
<Page1>.......</Page1>
<Page2>.......</Page2>
</magazine>
</bookshelf>
添加了对类的调用以编写XML
XMLWriter output = new XMLWriter(outputFilename, newBookshelf.TagPopulator());
output.FileOut();
除XMLWriter和TagFactory之外的所有对象都是由JAXB从模式生成的 由于我们没有看到XML模式,下面的代码可能不完全适合。但是,它确实根据XML示例生成有效的XML。列表被从文本文件中读取的扫描仪替换。我不太清楚你的while/switch的意图。我无法想象最后这些add()调用会如何正常工作 请注意,在将DOM树中的元素插入其父元素之前,无需完成表示该元素的对象。对于重复添加,请参考最新/最新的书籍或杂志 可能还有另一种方法来确定章节和页数。我完全不知道在一章或一页中应该发生什么
BookShelf bookshelf = new BookShelf();
bookshelf.setShelfnumber( "001" );
bookshelf.setShelfowner( "John Doe" );
File f = new File( "data.txt" );
Scanner scanner = new Scanner( f );
Book book = null;
Magazine magazine = null;
int chapters = 0;
int pages = 0;
while( scanner.hasNext() ){
int cellid = scanner.nextInt();
switch(cellid){
case 0:
book = new Book();
bookshelf.getBookOrMagazine().add( book );
book.setAuthor( scanner.nextLine() );
chapters = 0;
break;
case 1:
Chapter chapter = new Chapter();
book.getChapter().add( chapter );
chapter.setNumber( scanner.nextInt() );
book.setChapters( ++chapters );
break;
case 2:
magazine = new Magazine();
bookshelf.getBookOrMagazine().add( magazine );
magazine.setAuthor( scanner.nextLine() );
pages = 0;
break;
case 3:
Page page = new Page();
magazine.getPage().add( page );
page.setNumber( scanner.nextInt() );
magazine.setPages( ++pages );
break;
}
}
我使用的XML模式文件:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="2.0">
<xs:element name="bookshelf" type="BookShelf"/>
<xs:complexType name="BookShelf">
<xs:sequence>
<xs:element name="shelfnumber" type="xs:string"/>
<xs:element name="shelfowner" type="xs:string"/>
<xs:choice maxOccurs="unbounded">
<xs:element name="book" type="Book"/>
<xs:element name="magazine" type="Magazine"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Book">
<xs:sequence>
<xs:element name="Author" type="xs:string"/>
<xs:element name="Chapters" type="xs:int"/>
<xs:element name="chapter" type="Chapter" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Magazine">
<xs:sequence>
<xs:element name="Author" type="xs:string"/>
<xs:element name="Pages" type="xs:int"/>
<xs:element name="page" type="Page" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Chapter">
<xs:sequence>
<xs:element name="number" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Page">
<xs:sequence>
<xs:element name="number" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
我们需要看到更多的代码,没有XML模式文件就什么也做不了。您可以将其简化为book and magazine及其顶级元素“Author”。我无法编辑模式,我必须使用给定的模式并生成一个XML文件,该文件可以使用该模式进行验证。如果您的模式阻止您正确地对基类型进行子类化以获得所需的内容,那么您所做的将很难实现。您可以通过向类中添加列表
和列表
并使用工厂相应地填充每个列表来实现所需,而不是依赖多态性。对于case和while,我希望填充book标记的值。@newcoop--您想说什么?while/switch语句是从arraylist中提取值并填充book对象的字段(子标记)。chapter1/page1标记只是一个标记名。这些是JAXB使用模式创建的book/magazine对象的属性。这就是我添加到XML模式中的内容,部分是添加到代码中的内容。但我不知道如何从包含原始输入的“单元格”中获取这些属性的值。你理解代码有什么问题吗?谢谢,你的代码帮我解决了我的问题。事实证明,我在while循环的每次迭代中都创建了一个新的book对象,它只会覆盖该对象的属性。在特定情况下(而不是一般情况下)创建对象后,我能够用其属性填充对象。
BookShelf bookshelf = new BookShelf();
bookshelf.setShelfnumber( "001" );
bookshelf.setShelfowner( "John Doe" );
File f = new File( "data.txt" );
Scanner scanner = new Scanner( f );
Book book = null;
Magazine magazine = null;
int chapters = 0;
int pages = 0;
while( scanner.hasNext() ){
int cellid = scanner.nextInt();
switch(cellid){
case 0:
book = new Book();
bookshelf.getBookOrMagazine().add( book );
book.setAuthor( scanner.nextLine() );
chapters = 0;
break;
case 1:
Chapter chapter = new Chapter();
book.getChapter().add( chapter );
chapter.setNumber( scanner.nextInt() );
book.setChapters( ++chapters );
break;
case 2:
magazine = new Magazine();
bookshelf.getBookOrMagazine().add( magazine );
magazine.setAuthor( scanner.nextLine() );
pages = 0;
break;
case 3:
Page page = new Page();
magazine.getPage().add( page );
page.setNumber( scanner.nextInt() );
magazine.setPages( ++pages );
break;
}
}
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="2.0">
<xs:element name="bookshelf" type="BookShelf"/>
<xs:complexType name="BookShelf">
<xs:sequence>
<xs:element name="shelfnumber" type="xs:string"/>
<xs:element name="shelfowner" type="xs:string"/>
<xs:choice maxOccurs="unbounded">
<xs:element name="book" type="Book"/>
<xs:element name="magazine" type="Magazine"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Book">
<xs:sequence>
<xs:element name="Author" type="xs:string"/>
<xs:element name="Chapters" type="xs:int"/>
<xs:element name="chapter" type="Chapter" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Magazine">
<xs:sequence>
<xs:element name="Author" type="xs:string"/>
<xs:element name="Pages" type="xs:int"/>
<xs:element name="page" type="Page" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Chapter">
<xs:sequence>
<xs:element name="number" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Page">
<xs:sequence>
<xs:element name="number" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:schema>