Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取第一个标记Sax解析器_Java_Xml_Xml Parsing_Sax_Saxparser - Fatal编程技术网

Java 获取第一个标记Sax解析器

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

有没有办法使用sax解析器获取xml文件中的第一个标记并确保它具有相应的结束标记

只要处理endDocument,如果调用了它,那么它是格式良好的。

只要处理endDocument,如果调用了它,那么它是格式良好的。

您可以处理
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。当你到达一个文件结尾时就不会了。是的,你的权利是正确的,如果结束标记不存在,它将抛出一个异常