Java 解析XML并填充到Map中
我有如下xmlJava 解析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
<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
我的要求是在MapList
中设置比Map
好,如果OP不关心ab