Java 使用sax解析器解析和修改xml字符串

Java 使用sax解析器解析和修改xml字符串,java,sax,stringbuilder,Java,Sax,Stringbuilder,我有一个XML文件,我需要在其中搜索特定的标记并更新它的值。问题是,使用Sax解析器是“必须”的。我必须使用Sax解析器“仅”找到这些标记,dom stax j4dom dom4j解析器已不再考虑 我可以通过将xml文件转换为字符串并使用sax解析器对其进行解析并通过StringBuilderobject追加新值来完成此任务吗?可以吗?或者您会推荐什么?如果时间不是一个考虑因素,内存是一个考虑因素,那么SAX解析器是一个不错的选择 这是一个工作代码,只需添加缺少的导入即可。它使用SAX并将use

我有一个XML文件,我需要在其中搜索特定的标记并更新它的值。问题是,使用Sax解析器是“必须”的。我必须使用Sax解析器“仅”找到这些标记,dom stax j4dom dom4j解析器已不再考虑


我可以通过将xml文件转换为字符串并使用sax解析器对其进行解析并通过
StringBuilder
object追加新值来完成此任务吗?可以吗?或者您会推荐什么?

如果时间不是一个考虑因素,内存是一个考虑因素,那么SAX解析器是一个不错的选择

这是一个工作代码,只需添加缺少的导入即可。它使用SAX并将
user1
更改为
user2
。如果您了解了它是如何工作的,再加上阅读SAXAPI,您就可以用xml做任何事情。注意,在StAX出现之前,SAX一直被认为是最有效的xml解析器

public static void main(String[] args) throws Exception {
    String xml = "<users><user><name>user1</name></user></users>";
    XMLReader xr = new XMLFilterImpl(XMLReaderFactory.createXMLReader()) {
        private String tagName = "";
        @Override
        public void startElement(String uri, String localName, String qName, Attributes atts)
                throws SAXException {
            tagName = qName;
            super.startElement(uri, localName, qName, atts);
        }
        public void endElement(String uri, String localName, String qName) throws SAXException {
            tagName = "";
            super.endElement(uri, localName, qName);
        }
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            if (tagName.equals("name")) {
                ch = "user2".toCharArray();
                start = 0;
                length = ch.length; 
            }
            super.characters(ch, start, length);
        }
    };
    Source src = new SAXSource(xr, new InputSource(new StringReader(xml)));
    Result res = new StreamResult(System.out);
    TransformerFactory.newInstance().newTransformer().transform(src, res);
}
publicstaticvoidmain(字符串[]args)引发异常{
字符串xml=“user1”;
XMLReader xr=new XMLFilterImpl(XMLReaderFactory.createXMLReader()){
私有字符串标记名=”;
@凌驾
public void startElement(字符串uri、字符串localName、字符串qName、属性atts)
抛出SAX异常{
标记名=qName;
super.startElement(uri、localName、qName、atts);
}
public void endElement(字符串uri、字符串localName、字符串qName)引发SAXException{
标记名=”;
super.endElement(uri、localName、qName);
}
@凌驾
公共无效字符(char[]ch,int start,int length)引发异常{
if(标记名.equals(“名称”)){
ch=“user2”。toCharArray();
开始=0;
长度=通道长度;
}
超级字符(ch、开始、长度);
}
};
Source src=new-SAXSource(xr,new-InputSource(new-StringReader(xml));
Result res=新的StreamResult(System.out);
TransformerFactory.newInstance().newTransformer().transform(src,res);
}

检查链接SAX不用于修改现有XML。为什么不考虑dom等?为什么必须使用sax?这是一个多gig文档吗?这非常有用,只是在不同平台上使用时要小心加载正确的sax驱动程序