Java 获取第一个标记Sax解析器
有没有办法使用sax解析器获取xml文件中的第一个标记并确保它具有相应的结束标记 只要处理endDocument,如果调用了它,那么它是格式良好的。只要处理endDocument,如果调用了它,那么它是格式良好的。您可以处理Java 获取第一个标记Sax解析器,java,xml,xml-parsing,sax,saxparser,Java,Xml,Xml Parsing,Sax,Saxparser,有没有办法使用sax解析器获取xml文件中的第一个标记并确保它具有相应的结束标记 只要处理endDocument,如果调用了它,那么它是格式良好的。只要处理endDocument,如果调用了它,那么它是格式良好的。您可以处理startElement()、endElement()和endDocument(),或者只处理endDocument()endDocument()应引发异常。然而,为了学习,我将展示几个例子: public class MyParser extends DefaultHand
startElement()
、endElement()
和endDocument()
,或者只处理endDocument()
<如果文档格式不正确,则code>endDocument()应引发异常。然而,为了学习,我将展示几个例子:
public class MyParser extends DefaultHandler {
private String firstElement;
private String lastElement;
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
if(firstElement == null) {
firstElement = name;
}
}
public void endElement(String uri, String localName, String name) throws SAXException {
lastElement = name;
}
public void endDocument() {
if(lastElement.equals(firstElement)) {
// Well formed input
}
}
}
您还可以确保使用堆栈关闭所有元素:
public class MyParser extends DefaultHandler {
Stack<String> stk;
//...
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
stk.push(name);
}
public void endElement(String uri, String localName, String name) throws SAXException {
if(stk.pop().equals(name)) {
// Input is well formed for each tag
}
else {
// Not well-formed
}
}
}
公共类MyParser扩展了DefaultHandler{
堆栈stk;
//...
public void startElement(字符串uri、字符串localName、字符串名称、属性)引发SAXException{
stk.push(名称);
}
公共void endElement(字符串uri、字符串localName、字符串名称)引发SAXException{
if(stk.pop().equals(name)){
//每个标记的输入格式良好
}
否则{
//格式不好
}
}
}
您可以处理startElement()
、endElement()
和endDocument()
,或者只处理endDocument()
<如果文档格式不正确,则code>endDocument()应引发异常。然而,为了学习,我将展示几个例子:
public class MyParser extends DefaultHandler {
private String firstElement;
private String lastElement;
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
if(firstElement == null) {
firstElement = name;
}
}
public void endElement(String uri, String localName, String name) throws SAXException {
lastElement = name;
}
public void endDocument() {
if(lastElement.equals(firstElement)) {
// Well formed input
}
}
}
您还可以确保使用堆栈关闭所有元素:
public class MyParser extends DefaultHandler {
Stack<String> stk;
//...
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
stk.push(name);
}
public void endElement(String uri, String localName, String name) throws SAXException {
if(stk.pop().equals(name)) {
// Input is well formed for each tag
}
else {
// Not well-formed
}
}
}
公共类MyParser扩展了DefaultHandler{
堆栈stk;
//...
public void startElement(字符串uri、字符串localName、字符串名称、属性)引发SAXException{
stk.push(名称);
}
公共void endElement(字符串uri、字符串localName、字符串名称)引发SAXException{
if(stk.pop().equals(name)){
//每个标记的输入格式良好
}
否则{
//格式不好
}
}
}
这听起来更像是要使用DOM解析
如果使用sax解析,实际上是说不希望一次处理(加载到内存中)整个文档。如果搜索第一个结束标记(根标记),则一次扫描整个文档,从而失去了SAX的优势
加载文档时,如果文档格式不正确,DOM解析也会抛出。因此,无需手动检查根标记是否已关闭。这听起来更像是要使用DOM解析 如果使用sax解析,实际上是说不希望一次处理(加载到内存中)整个文档。如果搜索第一个结束标记(根标记),则一次扫描整个文档,从而失去了SAX的优势
加载文档时,如果文档格式不正确,DOM解析也会抛出。因此,无需手动检查根标记是否已关闭。如果任何标记未打开或关闭,SAX解析器实际上会引发异常,因此不需要对其进行处理……因此,如果XML文件错误/损坏,SAX解析器将引发异常。如果任何标记未打开或关闭,SAX解析器实际上会引发异常,因此不需要需要处理它…因此,如果XML文件错误/损坏,SAX解析器将抛出异常是的,但我不知道起始元素,因为它可以是一百个元素之一…但我需要知道XML文件上的第一个元素打开和关闭是啊,但我不知道起始元素,因为它可以是一百个元素之一…但我需要知道xml文件上的第一个元素打开和关闭我认为dom现在会更合适…但是改变它的努力太多了,因为我让sax解析器按原样做了这么多…endDocument()什么时候运行?是文档实际结束还是第一个标记的结束标记被读取?我不能向您保证SAX for Java的工作原理,我只在其他语言中使用SAX,在Java中使用DOM。但我认为应该在根标记关闭时触发endDocument。当你到达一个文件的结尾时就不会了。是的,你的权利是正确的,如果结束标记不存在,它会抛出一个例外。我认为dom现在会更合适……但是改变它的努力太多了,因为我让sax解析器做了这么多事情……endDocument()什么时候运行?是文档实际结束还是第一个标记的结束标记被读取?我不能向您保证SAX for Java的工作原理,我只在其他语言中使用SAX,在Java中使用DOM。但我认为应该在根标记关闭时触发endDocument。当你到达一个文件结尾时就不会了。是的,你的权利是正确的,如果结束标记不存在,它将抛出一个异常