Java 解析XML并填充到Map中

Java 解析XML并填充到Map中,java,xml,xml-parsing,Java,Xml,Xml Parsing,我有如下xml <Employees> <Employee id="1">Chuck</Employee> <Employee id="2">Al</Employee> <Employee id="3">Kiran</Employee> </Employees> private class Employees{ List<Employee&g

我有如下xml

<Employees>
      <Employee id="1">Chuck</Employee>
      <Employee id="2">Al</Employee>
      <Employee id="3">Kiran</Employee>
</Employees>
private class Employees{
        List<Employee> employees;
    }
    private class Employee{
        private String id;
        private String value;
}

扔出
艾尔
基兰
XML包含大量的员工,我只是为了简化而提到的

解析此xml并填充到映射中的最佳方法是什么?映射应包含id和名称对


请提供代码以便更好地理解。

使用诸如XStream之类的库<代码>列表比这里的地图更适合。

使用诸如XStream之类的库<代码>列表比这里的
映射
更合适。

我们可以使用Xstream简单地映射它

XStream xStream = new XStream(new DomDriver());
xStream.alias("Employees", Employees.class);
xStream.registerConverter(new MapEntryConverter());
employeesMap = (Map<String, String>) xStream.fromXML(queryXML);
XStream XStream=newxstream(newdomdriver());
别名(“Employees”,Employees.class);
registerConverter(新的MapEntryConverter());
employeesMap=(Map)xStream.fromXML(queryXML);
创建一个转换器,将XML解组为映射对象

private static class MapEntryConverter implements Converter {
        public boolean canConvert(Class clazz) {
            return clazz.equals(Employees.class);
        }

        public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
            AbstractMap<String, String> map = (AbstractMap<String, String>) value;
            for (Map.Entry<String, String> entry : map.entrySet()) {
                writer.startNode(entry.getKey().toString());
                writer.setValue(entry.getValue().toString());
                writer.endNode();
            }
        }

        public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
            Map<String, String> map = new HashMap<String, String>();

            while (reader.hasMoreChildren()) {
                reader.moveDown();
                map.put(reader.getAttribute(1), reader.getValue());
                reader.moveUp();
            }
            return map;
        }
    }
私有静态类MapEntryConverter实现转换器{
公共布尔canConvert(类clazz){
返回clazz.equals(Employees.class);
}
公共无效封送处理(对象值、HierarchycalStreamWriter编写器、封送上下文){
AbstractMap=(AbstractMap)值;
对于(Map.Entry:Map.entrySet()){
writer.startNode(entry.getKey().toString());
writer.setValue(entry.getValue().toString());
writer.endNode();
}
}
公共对象解组(HierarchycalStreamReader读取器,解组上下文){
Map Map=newhashmap();
while(reader.hasMoreChildren()){
reader.moveDown();
put(reader.getAttribute(1),reader.getValue());
reader.moveUp();
}
返回图;
}
}
创建Employee和Employee类,如下所示

<Employees>
      <Employee id="1">Chuck</Employee>
      <Employee id="2">Al</Employee>
      <Employee id="3">Kiran</Employee>
</Employees>
private class Employees{
        List<Employee> employees;
    }
    private class Employee{
        private String id;
        private String value;
}
私人类员工{
列出员工名单;
}
私家班员工{
私有字符串id;
私有字符串值;
}

希望这对您有用。

我们可以使用Xstream简单地映射它

XStream xStream = new XStream(new DomDriver());
xStream.alias("Employees", Employees.class);
xStream.registerConverter(new MapEntryConverter());
employeesMap = (Map<String, String>) xStream.fromXML(queryXML);
XStream XStream=newxstream(newdomdriver());
别名(“Employees”,Employees.class);
registerConverter(新的MapEntryConverter());
employeesMap=(Map)xStream.fromXML(queryXML);
创建一个转换器,将XML解组为映射对象

private static class MapEntryConverter implements Converter {
        public boolean canConvert(Class clazz) {
            return clazz.equals(Employees.class);
        }

        public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
            AbstractMap<String, String> map = (AbstractMap<String, String>) value;
            for (Map.Entry<String, String> entry : map.entrySet()) {
                writer.startNode(entry.getKey().toString());
                writer.setValue(entry.getValue().toString());
                writer.endNode();
            }
        }

        public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
            Map<String, String> map = new HashMap<String, String>();

            while (reader.hasMoreChildren()) {
                reader.moveDown();
                map.put(reader.getAttribute(1), reader.getValue());
                reader.moveUp();
            }
            return map;
        }
    }
私有静态类MapEntryConverter实现转换器{
公共布尔canConvert(类clazz){
返回clazz.equals(Employees.class);
}
公共无效封送处理(对象值、HierarchycalStreamWriter编写器、封送上下文){
AbstractMap=(AbstractMap)值;
对于(Map.Entry:Map.entrySet()){
writer.startNode(entry.getKey().toString());
writer.setValue(entry.getValue().toString());
writer.endNode();
}
}
公共对象解组(HierarchycalStreamReader读取器,解组上下文){
Map Map=newhashmap();
while(reader.hasMoreChildren()){
reader.moveDown();
put(reader.getAttribute(1),reader.getValue());
reader.moveUp();
}
返回图;
}
}
创建Employee和Employee类,如下所示

<Employees>
      <Employee id="1">Chuck</Employee>
      <Employee id="2">Al</Employee>
      <Employee id="3">Kiran</Employee>
</Employees>
private class Employees{
        List<Employee> employees;
    }
    private class Employee{
        private String id;
        private String value;
}
私人类员工{
列出员工名单;
}
私家班员工{
私有字符串id;
私有字符串值;
}
希望这对您有用。

似乎有很多代码。您可以使用JDK/JRE中的StAX API执行以下操作:

package forum11871952;

import java.io.FileReader;
import java.util.*;
import javax.xml.stream.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory xif = XMLInputFactory.newFactory();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("src/forum11871952/input.xml"));
        xsr.nextTag(); // advance to Employees tag
        xsr.nextTag(); // advance to first Employer element
        Map<String,String> map = new HashMap<String,String>();
        while(xsr.getLocalName().equals("Employee")) {
            map.put(xsr.getAttributeValue("", "id"), xsr.getElementText());
            xsr.nextTag(); // advance to next Employer element
        }
    }

}
用于UM11871952的包;
导入java.io.FileReader;
导入java.util.*;
导入javax.xml.stream.*;
公开课演示{
公共静态void main(字符串[]args)引发异常{
XMLInputFactory xif=XMLInputFactory.newFactory();
XMLStreamReader xsr=xif.createXMLStreamReader(新文件读取器(“src/forum11871952/input.xml”);
xsr.nextTag();//前进到Employees标记
xsr.nextTag();//前进到第一个雇主元素
Map Map=newhashmap();
而(xsr.getLocalName().equals(“雇员”)){
put(xsr.getAttributeValue(“,”id“),xsr.getElementText());
xsr.nextTag();//前进到下一个雇主元素
}
}
}
代码似乎很多。您可以使用JDK/JRE中的StAX API执行以下操作:

package forum11871952;

import java.io.FileReader;
import java.util.*;
import javax.xml.stream.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory xif = XMLInputFactory.newFactory();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("src/forum11871952/input.xml"));
        xsr.nextTag(); // advance to Employees tag
        xsr.nextTag(); // advance to first Employer element
        Map<String,String> map = new HashMap<String,String>();
        while(xsr.getLocalName().equals("Employee")) {
            map.put(xsr.getAttributeValue("", "id"), xsr.getElementText());
            xsr.nextTag(); // advance to next Employer element
        }
    }

}
用于UM11871952的包;
导入java.io.FileReader;
导入java.util.*;
导入javax.xml.stream.*;
公开课演示{
公共静态void main(字符串[]args)引发异常{
XMLInputFactory xif=XMLInputFactory.newFactory();
XMLStreamReader xsr=xif.createXMLStreamReader(新文件读取器(“src/forum11871952/input.xml”);
xsr.nextTag();//前进到Employees标记
xsr.nextTag();//前进到第一个雇主元素
Map Map=newhashmap();
而(xsr.getLocalName().equals(“雇员”)){
put(xsr.getAttributeValue(“,”id“),xsr.getElementText());
xsr.nextTag();//前进到下一个雇主元素
}
}
}

使用jdom并迭代添加到
映射中的所有员工条目。您尝试了什么?您知道SAX、DOM、XPATH等之间的区别吗。。。请在邮寄前搜索stackoverflow。我想这个问题已经回答了大约1000次。使用jdom并迭代所有员工条目,将其添加到
映射中。您尝试了什么?您知道SAX、DOM、XPATH等之间的区别吗。。。请在邮寄前搜索stackoverflow。我想这个问题已经回答了大约1000次。
List
Map
好,如果OP不关心查找时间。
Set
对这两个
List
或者
Map
我的要求是在Map
List
中设置比
Map
好,如果OP不关心ab