Java 通过JAXB解组XML

Java 通过JAXB解组XML,java,xml,jaxb,Java,Xml,Jaxb,我有一个xml,如下所示: <VisitorDataList> <VisitorData> <Attribute1List> <Attribute1> <Attribute1Name>name1</Attribute1Name> <Attribute1Id>2</Attribute1Id>

我有一个xml,如下所示:

<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)。