在JAVA中为另一个XML结构使用DOM解析器按ID获取元素

在JAVA中为另一个XML结构使用DOM解析器按ID获取元素,java,xml-parsing,xmldom,Java,Xml Parsing,Xmldom,我有一个XML文件,其结构如下: <Users> <user id="1" groupid="G1" username="GON"/> <user id="2" groupid="G2" username="NARUTO"/> <user id="3" groupid="G3" username="GOKU"/> </Users> 我需要获取groupid和username的属性值 现在我的JAVA代码 Docum

我有一个XML文件,其结构如下:

    <Users>
<user id="1" groupid="G1" username="GON"/>
<user id="2" groupid="G2" username="NARUTO"/>
<user id="3" groupid="G3" username="GOKU"/>
</Users>

我需要获取groupid和username的属性值

现在我的JAVA代码

    Document doc = db.parse(is);
NodeList nodes = doc.getElementsByTagName("Users");
for (int i = 0; i < nodes.getLength(); i++) {
    Element element = (Element) nodes.item(i);          
    NodeList Users = element.getElementsByTagName("User");
    for (int temp = 0; temp < Users.getLength(); temp++) {
        Node nNode = Users.item(temp);                                      
        System.out.println("\nCurrent Element :" + nNode.getNodeName());
        if (nNode.getNodeType() == Node.ELEMENT_NODE) {
            Element eElement = (Element) nNode;
            System.out.println("Staff username : " + eElement.getAttribute("username"));
        }
    }      
}
documentdoc=db.parse(is);
NodeList节点=doc.getElementsByTagName(“用户”);
对于(int i=0;i
您可以使用xstream完成此操作,并编写自己的转换器:

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.DomDriver;

import javax.xml.bind.JAXBException;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author heyunxia (love3400wind@163.com)
 * @version 1.0
 * @since 2016-01-15 上午11:21
 */
public class Xml2Bean {

    public static void main(String[] args) throws JAXBException, FileNotFoundException {

        XStream xstream = new XStream(new DomDriver());
        xstream.registerConverter(new UserCoverter());
        xstream.processAnnotations(User.class);
        xstream.addImplicitCollection(Users.class, "list");
        xstream.autodetectAnnotations(true);


        List<User> list = new ArrayList<>();
        list.add(new User("1", "G1", "GON"));
        list.add(new User("2", "G2", "NARUTO"));
        list.add(new User("3", "G3", "GOKU"));
        Users users = new Users(list);

        String xml = xstream.toXML(users);
        System.out.println(xml);

        Users usersFile = (Users) xstream.fromXML(xml);
        System.out.printf(usersFile.toString());
    }
}

class UserCoverter implements Converter {

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        User user = (User) source;
        writer.addAttribute("id", user.getId());
        writer.addAttribute("groupid", user.getGroupid());
        writer.addAttribute("username", user.getUsername());

    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        User user = new User();
        user.setId(reader.getAttribute("id"));
        user.setGroupid(reader.getAttribute("groupid"));
        user.setUsername(reader.getAttribute("username"));
        return user;
    }

    @Override
    public boolean canConvert(Class type) {
        return type.equals(User.class);
    }
}

@XStreamAlias("Users")
class Users {
    private List<User> list;

    public Users(List<User> list) {
        this.list = list;
    }
}


@XStreamAlias("user")
class User {
    @XStreamAlias("id")
    private String id;
    private String groupid;
    private String username;

    public User() {
    }

    public User(String id, String groupid, String username) {
        this.id = id;
        this.groupid = groupid;
        this.username = username;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getGroupid() {
        return groupid;
    }

    public void setGroupid(String groupid) {
        this.groupid = groupid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
import com.thoughtworks.xstream.xstream;
导入com.thoughtworks.xstream.annotations.XStreamAlias;
导入com.thoughtworks.xstream.converters.Converter;
导入com.thoughtworks.xstream.converters.MarshallingContext;
导入com.thoughtworks.xstream.converters.UnmarshallingContext;
导入com.thoughtworks.xstream.io.HierarchycalStreamReader;
导入com.thoughtworks.xstream.io.HierarchycalStreamWriter;
导入com.thoughtworks.xstream.io.xml.DomDriver;
导入javax.xml.bind.JAXBException;
导入java.io.FileNotFoundException;
导入java.util.ArrayList;
导入java.util.List;
/**
*@作者何云霞(love3400wind@163.com)
*@version 1.0
*@自2016年1月15日起上午11:21
*/
公共类Xml2Bean{
公共静态void main(字符串[]args)抛出jaxbeexception、FileNotFoundException{
XStream XStream=newxstream(newdomdriver());
registerConverter(newuserconverter());
processAnnotations(User.class);
addImplicitCollection(Users.class,“list”);
xstream.autodetectanotations(true);
列表=新的ArrayList();
添加(新用户(“1”、“G1”、“GON”);
添加(新用户(“2”、“G2”、“火影忍者”);
添加(新用户(“3”、“G3”、“小悟空”);
用户=新用户(列表);
字符串xml=xstream.toXML(用户);
System.out.println(xml);
Users usersFile=(Users)xstream.fromXML(xml);
System.out.printf(usersFile.toString());
}
}
类UserCoverter实现转换器{
@凌驾
公共无效封送处理(对象源、HierarchycalStreamWriter编写器、封送上下文){
用户=(用户)源;
writer.addAttribute(“id”,user.getId());
writer.addAttribute(“groupid”,user.getGroupid());
writer.addAttribute(“username”,user.getUsername());
}
@凌驾
公共对象解组(HierarchycalStreamReader读取器,解组上下文){
用户=新用户();
user.setId(reader.getAttribute(“id”);
user.setGroupid(reader.getAttribute(“groupid”);
user.setUsername(reader.getAttribute(“用户名”);
返回用户;
}
@凌驾
公共布尔canConvert(类类型){
返回类型.equals(User.class);
}
}
@XStreamAlias(“用户”)
类用户{
私人名单;
公共用户(列表){
this.list=列表;
}
}
@XStreamAlias(“用户”)
类用户{
@XStreamAlias(“id”)
私有字符串id;
私有字符串groupid;
私有字符串用户名;
公共用户(){
}
公共用户(字符串id、字符串组id、字符串用户名){
this.id=id;
this.groupid=groupid;
this.username=用户名;
}
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
公共字符串getGroupid(){
返回groupid;
}
public void setGroupid(字符串groupid){
this.groupid=groupid;
}
公共字符串getUsername(){
返回用户名;
}
public void setUsername(字符串用户名){
this.username=用户名;
}
}

谢谢您的建议@thinkling,但首先我想从收到的XML格式中获取用户列表。是的,它包含序列化程序和反序列化程序,您注意到了吗:Users usersFile=(Users)xstream.fromXML(xml);