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