Java中的Xml解析、编辑、保存和创建

Java中的Xml解析、编辑、保存和创建,java,xml,dom,xml-parsing,dom4j,Java,Xml,Dom,Xml Parsing,Dom4j,我必须解析XML现在我已经使用了SAX解析器现在我必须显示、编辑它并最终创建XML现在的问题是我如何使用SAX解析器做到这一点,因为它没有这个功能。我的处境很艰难,我也搜索过关于dom4j和DOM的东西。我的代码如下所示 public class XmlBack extends DefaultHandler { public void startElement(String uri, String localName, String qName, Attribu

我必须解析XML现在我已经使用了SAX解析器现在我必须显示、编辑它并最终创建XML现在的问题是我如何使用SAX解析器做到这一点,因为它没有这个功能。我的处境很艰难,我也搜索过关于dom4j和DOM的东西。我的代码如下所示

public class XmlBack extends DefaultHandler {

    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {        
        if (qName.equalsIgnoreCase("VarGroup")) {
            varGroupVariables = new HashMap<String, List<VarGroupVariable>>();
        }else if (qName.equalsIgnoreCase("Variable")) {
            varGroupVariable = new VarGroupVariable();
            nameAttribute = attributes.getValue("Name");
            varGroupVariable.setName(nameAttribute);
        }else if (qName.equalsIgnoreCase("TYP")) {
            btype = true;
        }else if (qName.equalsIgnoreCase("VALUE")) {
            bvalue = true;
        }       
    }
    public void characters(char ch[], int start, int length)
            throws SAXException {
        String vtype = null;

        if (btype) {
            vtype = new String(ch, start, length);
            varGroupVariable.setType(vtype);
            btype = false;
        }

        Double value = null;
        if (bvalue) {
            String vvalue = new String(ch, start, length);
            try {
                value = Double.valueOf(vvalue);
            } catch (NumberFormatException ne) {
                value = 0d;
            }
            varGroupVariable.setValue(value);
            bvalue = false;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if (qName.equalsIgnoreCase("Variable")) {
            String varGroupVariableName = varGroupVariable.getName().split("\\.")[0];
            String name = varGroupVariableName.substring(0,varGroupVariableName.length() - 1);
            String name1= varGroupVariableName = varGroupVariable.getName().split("\\.")[1];
            System.out.println(name1);
            List<VarGroupVariable> varGroupVariablesList;
            if(varGroupVariables.containsKey(name)) {
                varGroupVariablesList = varGroupVariables.get(name);                 
            }else {
                varGroupVariablesList = new ArrayList<VarGroupVariable>();
            }
            int serial = varGroupVariablesList.size();
            varGroupVariable.setSerial(++serial);
            varGroupVariablesList.add(varGroupVariable);        
            varGroupVariables.put(name, varGroupVariablesList);
            //System.out.println(name+"\n");
            }
    }
    private int no = 1;
    boolean bcore,bmold,bvalue,btype = false;
    String nameAttribute;
    Map<String, List<VarGroupVariable>> varGroupVariables;
    VarGroupVariable varGroupVariable;
}
公共类XmlBack扩展了DefaultHandler{
public void startElement(字符串uri、字符串localName、字符串qName、,
属性)引发SAX异常{
if(qName.equalsIgnoreCase(“VARGOUP”)){
varGroupVariables=newhashmap();
}else if(qName.equalsIgnoreCase(“变量”)){
varGroupVariable=新的varGroupVariable();
nameAttribute=attributes.getValue(“名称”);
varGroupVariable.setName(nameAttribute);
}else if(qName.equalsIgnoreCase(“典型”)){
b类型=真;
}else if(qName.equalsIgnoreCase(“值”)){
b值=真;
}       
}
公共无效字符(字符ch[],整数开始,整数长度)
抛出SAX异常{
字符串vtype=null;
如果(b类型){
vtype=新字符串(ch、开始、长度);
varGroupVariable.setType(vtype);
b类型=假;
}
双值=空;
if(bvalue){
字符串V值=新字符串(ch、开始、长度);
试一试{
值=双精度。值(V值);
}捕获(数字格式){
数值=0d;
}
varGroupVariable.setValue(值);
b值=假;
}
}
@凌驾
公共void endElement(字符串uri、字符串localName、字符串qName)
抛出SAX异常{
if(qName.equalsIgnoreCase(“变量”)){
字符串varGroupVariableName=varGroupVariable.getName().split(“\\”)[0];
String name=varGroupVariableName.substring(0,varGroupVariableName.length()-1);
字符串名称1=varGroupVariableName=varGroupVariable.getName().split(“\\”)[1];
系统输出打印项次(名称1);
列表varGroupVariablesList;
if(varGroupVariables.containsKey(名称)){
varGroupVariablesList=varGroupVariables.get(名称);
}否则{
varGroupVariablesList=newarraylist();
}
int serial=varGroupVariablesList.size();
varGroupVariable.setSerial(++串行);
varGroupVariablesList.add(varGroupVariable);
put(名称,varGroupVariablesList);
//System.out.println(名称+“\n”);
}
}
私有int no=1;
布尔bcore,bmold,bvalue,btype=false;
字符串名称属性;
映射变量;
VarGroupVariable;
}

除非您的XML不是不合理的复杂,或者如果您有可用的模式,否则最简单的选择可能是JAXB。例如,这里有一些教程。当然,StackOverflow也是JAXB知识的良好来源。

确切的问题是什么?我希望您已经(成功地)将XML解析到内存中。根据需要编辑/更改值和结构,然后将其写出。我猜想您会发现使用DOM更容易,因为大多数人都有工具来更改值、结构并将其写出。FWIW我使用nu.xom XOMThanks进行回复。我的问题是直到我使用了sax解析器,但现在它没有创建XML。现在可以使用DOM吗?还是必须将代码/解析器sax更改为DOM。我需要使用什么方法来解析、编辑和创建XML文件。JDom、Dom、Sax、Dom4j。请提供一个清晰的想法。感谢您的时间和帮助。这对我有帮助。