Java 通过JAXB解组XML
我有一个xml,如下所示:Java 通过JAXB解组XML,java,xml,jaxb,Java,Xml,Jaxb,我有一个xml,如下所示: <VisitorDataList> <VisitorData> <Attribute1List> <Attribute1> <Attribute1Name>name1</Attribute1Name> <Attribute1Id>2</Attribute1Id>
<VisitorDataList>
<VisitorData>
<Attribute1List>
<Attribute1>
<Attribute1Name>name1</Attribute1Name>
<Attribute1Id>2</Attribute1Id>
</Attribute1>
<Attribute1>
<Attribute1Name>name1</Attribute1Name>
<Attribute1Id>3</Attribute1Id>
</Attribute1>
<Attribute1>
<Attribute1Name>name1</Attribute1Name>
<Attribute1Id>1</Attribute1Id>
</Attribute1>
</Attribute1List>
<Attribute2List>
<Attribute2>
<Attribute2Name>name2</Attribute2Name>
<Attribute2Id>113</Attribute2Id>
</Attribute2>
<Attribute2>
<Attribute2Name>name2</Attribute2Name>
<Attribute2Id>115</Attribute2Id>
</Attribute2>
<Attribute2>
<Attribute2Name>name2</Attribute2Name>
<Attribute2Id>114</Attribute2Id>
</Attribute2>
</Attribute2List>
</VisitorData>
</VisitorDataList>
我的问题是如何将所有属性名称映射到一个列表中?提前感谢。您可以使用JAXB从StAX中解组,并使用StreamReaderDelegate从元素名称中去除数字。然后将对元素进行JAXB映射 下面是我写的一篇文章的链接,我在文章中使用这种方法进行不区分大小写的解组:
Java模型 VistorDataList
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "VisitorDataList")
public class VisitorDataList {
private List<Visitor> visitors;
@XmlElementWrapper(name="VisitorData")
@XmlElement(name = "AttributeList")
public List<Visitor> getVisitors() {
return visitors;
}
public void setVisitors(List<Visitor> visitors) {
this.visitors = visitors;
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<VisitorDataList>
<VisitorData>
<AttributeList>
<AttributeName>name1</AttributeName>
<AttributeName>name1</AttributeName>
<AttributeName>name1</AttributeName>
</AttributeList>
<AttributeList>
<AttributeName>name2</AttributeName>
<AttributeName>name2</AttributeName>
<AttributeName>name2</AttributeName>
</AttributeList>
</VisitorData>
</VisitorDataList>
输出
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "VisitorDataList")
public class VisitorDataList {
private List<Visitor> visitors;
@XmlElementWrapper(name="VisitorData")
@XmlElement(name = "AttributeList")
public List<Visitor> getVisitors() {
return visitors;
}
public void setVisitors(List<Visitor> visitors) {
this.visitors = visitors;
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<VisitorDataList>
<VisitorData>
<AttributeList>
<AttributeName>name1</AttributeName>
<AttributeName>name1</AttributeName>
<AttributeName>name1</AttributeName>
</AttributeList>
<AttributeList>
<AttributeName>name2</AttributeName>
<AttributeName>name2</AttributeName>
<AttributeName>name2</AttributeName>
</AttributeList>
</VisitorData>
</VisitorDataList>
名称1
名称1
名称1
姓名2
姓名2
姓名2
您可以使用JAXB通过StreamReaderDelegate从StAX中解组,从而从元素名称中去除数字。然后将对元素进行JAXB映射
下面是我写的一篇文章的链接,我在文章中使用这种方法进行不区分大小写的解组:
Java模型 VistorDataList
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "VisitorDataList")
public class VisitorDataList {
private List<Visitor> visitors;
@XmlElementWrapper(name="VisitorData")
@XmlElement(name = "AttributeList")
public List<Visitor> getVisitors() {
return visitors;
}
public void setVisitors(List<Visitor> visitors) {
this.visitors = visitors;
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<VisitorDataList>
<VisitorData>
<AttributeList>
<AttributeName>name1</AttributeName>
<AttributeName>name1</AttributeName>
<AttributeName>name1</AttributeName>
</AttributeList>
<AttributeList>
<AttributeName>name2</AttributeName>
<AttributeName>name2</AttributeName>
<AttributeName>name2</AttributeName>
</AttributeList>
</VisitorData>
</VisitorDataList>
输出
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "VisitorDataList")
public class VisitorDataList {
private List<Visitor> visitors;
@XmlElementWrapper(name="VisitorData")
@XmlElement(name = "AttributeList")
public List<Visitor> getVisitors() {
return visitors;
}
public void setVisitors(List<Visitor> visitors) {
this.visitors = visitors;
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<VisitorDataList>
<VisitorData>
<AttributeList>
<AttributeName>name1</AttributeName>
<AttributeName>name1</AttributeName>
<AttributeName>name1</AttributeName>
</AttributeList>
<AttributeList>
<AttributeName>name2</AttributeName>
<AttributeName>name2</AttributeName>
<AttributeName>name2</AttributeName>
</AttributeList>
</VisitorData>
</VisitorDataList>
名称1
名称1
名称1
姓名2
姓名2
姓名2
我尝试使用JAXB对XML文件进行解组,但只能静态解析。您可以尝试一次
visitor.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<VisitorDataList>
<VisitorData>
<AttributeList>
<Attribute>
<AttributeName>name1</AttributeName>
<AttributeId>2</AttributeId>
</Attribute>
<Attribute>
<AttributeName>name1</AttributeName>
<AttributeId>3</AttributeId>
</Attribute>
<Attribute>
<AttributeName>name1</AttributeName>
<AttributeId>1</AttributeId>
</Attribute>
</AttributeList>
<AttributeList>
<Attribute>
<AttributeName>name2</AttributeName>
<AttributeId>113</AttributeId>
</Attribute>
<Attribute>
<AttributeName>name2</AttributeName>
<AttributeId>115</AttributeId>
</Attribute>
<Attribute>
<AttributeName>name2</AttributeName>
<AttributeId>114</AttributeId>
</Attribute>
</AttributeList>
</VisitorData>
JAXBExample.java
package foo.bar.me.too;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="VisitorDataList")
public class visitordatalist {
List<visitordata> vstd;
@XmlElement(name="VisitorData")
public List<visitordata> getVstd() {
return vstd;
}
public void setVstd(List<visitordata> vstd) {
this.vstd = vstd;
}
}
package foo.bar.me.too;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
public class visitordata {
List<attributelist> atrl;
public String toString() {
return atrl.toString();
}
@XmlElement(name="AttributeList")
public List<attributelist> getAtrl() {
return atrl;
}
public void setAtrl(List<attributelist> atrl) {
this.atrl = atrl;
}
}
package foo.bar.me.too;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
public class attributelist {
List<attribute> atr;
public String toString() {
return atr.toString();
}
@XmlElement(name="Attribute")
public List<attribute> getAtr() {
return atr;
}
public void setAtr(List<attribute> atr) {
this.atr = atr;
}
}
package foo.bar.me.too;
import javax.xml.bind.annotation.XmlElement;
public class attribute {
String atrName;
String atrId;
public String toString() {
return atrName+" "+atrId;
}
@XmlElement(name="AttributeName")
public String getAtrName() {
return atrName;
}
public void setAtrName(String atrName) {
this.atrName = atrName;
}
@XmlElement(name="AttributeId")
public String getAtrId() {
return atrId;
}
public void setAtrId(String atrId) {
this.atrId = atrId;
}
}
package foo.bar.me.too;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
public class JAXBExample {
public static void main(String[] args) {
try {
File file = new File("visitor.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(visitordatalist.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
visitordatalist vstdl = (visitordatalist) jaxbUnmarshaller.unmarshal(file);
System.out.println(vstdl.getVstd());
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
我尝试使用JAXB对XML文件进行解组,但只能静态解析。您可以尝试一次 visitor.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<VisitorDataList>
<VisitorData>
<AttributeList>
<Attribute>
<AttributeName>name1</AttributeName>
<AttributeId>2</AttributeId>
</Attribute>
<Attribute>
<AttributeName>name1</AttributeName>
<AttributeId>3</AttributeId>
</Attribute>
<Attribute>
<AttributeName>name1</AttributeName>
<AttributeId>1</AttributeId>
</Attribute>
</AttributeList>
<AttributeList>
<Attribute>
<AttributeName>name2</AttributeName>
<AttributeId>113</AttributeId>
</Attribute>
<Attribute>
<AttributeName>name2</AttributeName>
<AttributeId>115</AttributeId>
</Attribute>
<Attribute>
<AttributeName>name2</AttributeName>
<AttributeId>114</AttributeId>
</Attribute>
</AttributeList>
</VisitorData>
JAXBExample.java
package foo.bar.me.too;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="VisitorDataList")
public class visitordatalist {
List<visitordata> vstd;
@XmlElement(name="VisitorData")
public List<visitordata> getVstd() {
return vstd;
}
public void setVstd(List<visitordata> vstd) {
this.vstd = vstd;
}
}
package foo.bar.me.too;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
public class visitordata {
List<attributelist> atrl;
public String toString() {
return atrl.toString();
}
@XmlElement(name="AttributeList")
public List<attributelist> getAtrl() {
return atrl;
}
public void setAtrl(List<attributelist> atrl) {
this.atrl = atrl;
}
}
package foo.bar.me.too;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
public class attributelist {
List<attribute> atr;
public String toString() {
return atr.toString();
}
@XmlElement(name="Attribute")
public List<attribute> getAtr() {
return atr;
}
public void setAtr(List<attribute> atr) {
this.atr = atr;
}
}
package foo.bar.me.too;
import javax.xml.bind.annotation.XmlElement;
public class attribute {
String atrName;
String atrId;
public String toString() {
return atrName+" "+atrId;
}
@XmlElement(name="AttributeName")
public String getAtrName() {
return atrName;
}
public void setAtrName(String atrName) {
this.atrName = atrName;
}
@XmlElement(name="AttributeId")
public String getAtrId() {
return atrId;
}
public void setAtrId(String atrId) {
this.atrId = atrId;
}
}
package foo.bar.me.too;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
public class JAXBExample {
public static void main(String[] args) {
try {
File file = new File("visitor.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(visitordatalist.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
visitordatalist vstdl = (visitordatalist) jaxbUnmarshaller.unmarshal(file);
System.out.println(vstdl.getVstd());
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
对于一些特殊的JAXB实现,有一种特殊的神秘知识。例如,对于FasterXML(在WildFly中使用),您应该更改一个属性以使其工作(只需覆盖Delegator中的其他方法):
@覆盖
公共对象getProperty(字符串名称){
对象属性=super.getProperty(名称);
if(“org.codehaus.stax2.internNames.equals(name)){
返回Boolean.FALSE;
}
归还财产;
}
对于一些特殊的JAXB实现,有一种特殊的神秘知识。例如,对于FasterXML(在WildFly中使用),您应该更改一个属性以使其工作(只需覆盖Delegator中的其他方法):
@覆盖
公共对象getProperty(字符串名称){
对象属性=super.getProperty(名称);
if(“org.codehaus.stax2.internNames.equals(name)){
返回Boolean.FALSE;
}
归还财产;
}
您希望在访问者
类的属性
属性中包含哪些字符串?@Blaise Doughan:仅属性名称您希望在访问者
类的属性
属性中包含哪些字符串?@Blaise Doughan:仅属性名称谢谢您提供的信息,但是我尝试了,但失败了,你能给出代码示例吗?@foredite-我用一个完整的示例更新了我的答案。对于一些特殊的JAXB实现,有一种特殊的神秘知识。例如,对于FasterXML(在WildFly中使用),您应该更改一个属性以使其工作(只需覆盖Delegator中的另一个方法):“org.codehaus.stax2.internNames”。请参阅下面我的答案…感谢您提供的信息,但我尝试了,但失败了,您能给出代码示例吗?@forebuite-我已经用一个完整的示例更新了我的答案。对于一些特殊的JAXB实现,有一种特殊的神秘知识。例如,对于FasterXML(在WildFly中使用),您应该更改一个属性以使其工作(只需覆盖Delegator中的另一个方法):“org.codehaus.stax2.internNames”。请看下面我的答案…注意:您应该在类名上使用驼峰大小写,仅用于约定(例如:AttributeList而不是AttributeList)。注意:您应该在类名上使用驼峰大小写,仅用于约定(例如:AttributeList而不是AttributeList)。