Java SAX解析器不调用start元素

Java SAX解析器不调用start元素,java,xml-parsing,sax,saxparser,Java,Xml Parsing,Sax,Saxparser,我试图执行下面的代码,但我的SAX解析器没有调用startElement方法 下面是我的代码: package getTableStructure; import java.util.List; import java.io.*; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory

我试图执行下面的代码,但我的SAX解析器没有调用startElement方法

下面是我的代码:

package getTableStructure;

import java.util.List;
import java.io.*;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

import getTableStructure.DBdetails;

public class InformaticaObjectParser {
//H:/Eclipse_Workspace/GWM_SHARED_DEFINITION.XML
//H:/Eclipse_Workspace/InformaticaTableStruct/
public static void main(String[] args) {
    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
    if (args.length == 2){
        System.out.println(args[1]);
        File opDir = new File(args[1].trim());
        if (opDir.exists() && opDir.isDirectory()){
            try {
                SAXParser saxParser = saxParserFactory.newSAXParser();
                System.out.println("Parser object created");
                MyHandler handler = new MyHandler();
                System.out.println(handler);
                saxParser.parse(new File(args[0]), handler);
                String outputDir = args[1].trim(); 
                System.out.println("I am here");
                List<DBdetails> TableList = handler.getEmpList();
                for(DBdetails db : TableList){
                    System.out.println("Table list from XML: " + TableList);
                    //BufferedWriter out = new BufferedWriter(new     FileWriter("H:/Eclipse_Workspace/TableStruct/" + tableName + ".csv"));
                    BufferedWriter out = new BufferedWriter(new FileWriter( outputDir + db.getName().trim()+"."+db.getSource().trim()+".csv"));
                        for (String k : db.dbdetail.keySet() ){
                        out.write(k+","+db.dbdetail.get(k));
                        out.newLine();
                        }
                        out.close();
                    }
                } 
                catch (ParserConfigurationException | SAXException | IOException e)     {
                    e.getMessage();
                }
            }
            else{
                System.out.println("2 arguments");
            }
        }
        else{
            System.out.println(" Number of arguments should be 2");
        }
    }
}
包getTableStructure;
导入java.util.List;
导入java.io.*;
导入javax.xml.parsers.parserConfiguration异常;
导入javax.xml.parsers.SAXParser;
导入javax.xml.parsers.SAXParserFactory;
导入org.xml.sax.SAXException;
导入getTableStructure.DBdetails;
公共类InformaticaObjectParser{
//H:/Eclipse\u Workspace/GWM\u SHARED\u DEFINITION.XML
//H:/Eclipse\u工作区/informaticatablestract/
公共静态void main(字符串[]args){
SAXParserFactory SAXParserFactory=SAXParserFactory.newInstance();
如果(args.length==2){
System.out.println(args[1]);
File opDir=新文件(args[1].trim());
if(opDir.exists()&&opDir.isDirectory()){
试一试{
SAXParser SAXParser=saxParserFactory.newSAXParser();
System.out.println(“创建的解析器对象”);
MyHandler=新的MyHandler();
System.out.println(处理程序);
parse(新文件(args[0]),处理程序);
字符串outputDir=args[1].trim();
System.out.println(“我在这里”);
List TableList=handler.getEmpList();
用于(数据库详细信息数据库:表格列表){
System.out.println(“来自XML的表列表:“+TableList”);
//BufferedWriter out=新的BufferedWriter(新的文件编写器(“H:/Eclipse_Workspace/TableStruct/”+tableName+“.csv”);
BufferedWriter out=new BufferedWriter(新文件写入程序(outputDir+db.getName().trim()+“+db.getSource().trim()+”);
for(字符串k:db.dbdetail.keySet()){
out.write(k+”,“+db.dbdetail.get(k));
out.newLine();
}
out.close();
}
} 
捕获(ParserConfiguration异常| SAXException | IOE异常){
e、 getMessage();
}
}
否则{
System.out.println(“2个参数”);
}
}
否则{
System.out.println(“参数数量应为2”);
}
}
}
我的经纪人:

package getTableStructure;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import getTableStructure.DBdetails;

public class MyHandler extends DefaultHandler {

    private List<DBdetails> sourceList = null;
private DBdetails table = null;
public List<DBdetails> getEmpList() {
    return sourceList;
}
boolean bSource = false;
boolean bName = false;

@Override
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {
    System.out.println("In MyHandler");
    System.out.println(qName);
    if (qName.equalsIgnoreCase("SOURCE")) {
        table = new DBdetails();
        String NAME = attributes.getValue("DBDNAME");
        String DbName = attributes.getValue("NAME");
        table.setName(NAME.trim());
        table.setSource(DbName.trim());
        if (sourceList == null)
            sourceList = new ArrayList<>();
    } else if (qName.equalsIgnoreCase("DBDNAME")) {
        bName = true;
    } else if (qName.equalsIgnoreCase("NAME")) {
        bSource = true;
    } else if (qName.equalsIgnoreCase("SOURCEFIELD")) {
        String details = (attributes.getValue("DATATYPE").trim()+","+attributes.getValue("PRECISION").trim()+","+attributes.getValue("SCALE").trim());
        this.table.dbdetail.put(attributes.getValue("NAME").trim(),
                details);
    }
}

@Override
public void endElement(String uri, String localName, String qName)
        throws SAXException {
    if (qName.equalsIgnoreCase("SOURCE")) {
        sourceList.add(table);
    }
}

@Override
public void characters(char ch[], int start, int length)
        throws SAXException {
    if (bName) {
        table.setName(new String(ch, start, length));
        bName = false;
    } else if (bSource) {
        table.setSource(new String(ch, start, length));
        bSource = false;
    }
}
包getTableStructure;
导入java.util.ArrayList;
导入java.util.List;
导入org.xml.sax.Attributes;
导入org.xml.sax.SAXException;
导入org.xml.sax.helpers.DefaultHandler;
导入getTableStructure.DBdetails;
公共类MyHandler扩展了DefaultHandler{
私有列表sourceList=null;
私有DBdetails表=null;
公共列表getEmpList(){
返回源列表;
}
布尔b源=假;
布尔bName=false;
@凌驾
public void startElement(字符串uri、字符串localName、字符串qName、,
属性)引发SAX异常{
System.out.println(“在MyHandler中”);
System.out.println(qName);
if(qName.equalsIgnoreCase(“源”)){
table=新的DBdetails();
字符串名称=attributes.getValue(“DBDNAME”);
字符串DbName=attributes.getValue(“名称”);
table.setName(NAME.trim());
table.setSource(DbName.trim());
if(sourceList==null)
sourceList=newarraylist();
}else if(qName.equalsIgnoreCase(“DBDNAME”)){
bName=true;
}else if(qName.equalsIgnoreCase(“名称”)){
b来源=真;
}else if(qName.equalsIgnoreCase(“SOURCEFIELD”)){
字符串详细信息=(attributes.getValue(“数据类型”).trim()+,“+attributes.getValue(“精度”).trim()+,“+attributes.getValue(“比例”).trim());
this.table.dbdetail.put(attributes.getValue(“NAME”).trim(),
详情);
}
}
@凌驾
公共void endElement(字符串uri、字符串localName、字符串qName)
抛出SAX异常{
if(qName.equalsIgnoreCase(“源”)){
sourceList.add(表);
}
}
@凌驾
公共无效字符(字符ch[],整数开始,整数长度)
抛出SAX异常{
如果(bName){
table.setName(新字符串(ch,start,length));
bName=false;
}else if(b源){
table.setSource(新字符串(ch、start、length));
b来源=假;
}
}
}

以下是XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE POWERMART SYSTEM "powrmart.dtd">
<POWERMART CREATION_DATE="06/01/2015 11:44:43" REPOSITORY_VERSION="182.91">
<REPOSITORY NAME="PB_DEV02" VERSION="182" CODEPAGE="Latin1" DATABASETYPE="Sybase">
<FOLDER NAME="PB_DEFINITIONS" GROUP="" OWNER="E466701" SHARED="SHARED" DESCRIPTION="Place all PB source/target definitions here and use shortcuts for them in other PB_* folders." PERMISSIONS="rwx---rwx" UUID="6c90f1e5-b619-48fd-8ee1-5b0b136947ea">
    <SOURCE BUSINESSNAME ="" DATABASETYPE ="Sybase" DBDNAME ="database" DESCRIPTION ="" NAME ="table_name" OBJECTVERSION ="1" OWNERNAME ="dbo" VERSIONNUMBER ="1">
        <SOURCEFIELD BUSINESSNAME ="" DATATYPE ="varchar" DESCRIPTION ="" FIELDNUMBER ="1" FIELDPROPERTY ="0" FIELDTYPE ="ELEMITEM" HIDDEN ="NO" KEYTYPE ="PRIMARY KEY" LENGTH ="0" LEVEL ="0" NAME ="Col1" NULLABLE ="NOTNULL" OCCURS ="0" OFFSET ="0" PHYSICALLENGTH ="8" PHYSICALOFFSET ="0" PICTURETEXT ="" PRECISION ="8" SCALE ="0" USAGE_FLAGS =""/>
        <SOURCEFIELD BUSINESSNAME ="" DATATYPE ="varchar" DESCRIPTION ="" FIELDNUMBER ="2" FIELDPROPERTY ="0" FIELDTYPE ="ELEMITEM" HIDDEN ="NO" KEYTYPE ="NOT A KEY" LENGTH ="0" LEVEL ="0" NAME ="col2" NULLABLE ="NULL" OCCURS ="0" OFFSET ="0" PHYSICALLENGTH ="254" PHYSICALOFFSET ="8" PICTURETEXT ="" PRECISION ="254" SCALE ="0" USAGE_FLAGS =""/>
    </SOURCE>
    ..
    ..
    ..
</FOLDER>
</REPOSITORY>
</POWERMART>

..
..
..
几个月前,当我编写这个项目时,它工作得非常好,但当我现在打开它并尝试运行InformaticaObjectParser时,它没有在MyHandler中调用start元素方法,并且编程存在,没有给出任何错误

如果您需要任何其他信息,请告诉我


谢谢

尝试覆盖fatalError、error和warning方法,查看文档中是否有错误

public class MyHandler extends DefaultHandler {
...

    @Override
    public void fatalError(SAXParseException e) throws SAXException {
        LOG.log(Level.SEVERE, e.getMessage(), e);
        throw new SAXException(e.getMessage());
    }

    @Override
    public void error(SAXParseException e) throws SAXException {
        LOG.log(Level.SEVERE, e.getMessage(), e);
        throw new SAXException(e.getMessage());
    }

    @Override
    public void warning(SAXParseException e) throws SAXException {
        LOG.log(Level.WARNING, e.getMessage(), e);
    }
...
}

嘿,伙计们,谢谢你们抽出时间。我得到了它。这是因为xml中的下线

<!DOCTYPE POWERMART SYSTEM "powrmart.dtd">

当我删除它时,代码起作用了。我不知道原因是什么。谁能给它点灯吗


再次感谢您的时间。

您无需从xml中删除DOCTYPE即可使其正常工作。只需添加实体解析器,即可将dtd解析为空文档,如下所示:

saxParser.getXMLReader().setEntityResolver(new EntityResolver(){
    public InputSource resolveEntity(String publicId,String systemId){
        return new InputSource(new ByteArrayInputStream(new byte[0]));
    }
});

你没有发布MyHandler的代码。糟糕。我现在加上去了。谢谢你指出:)请缩进你的代码。这很难阅读。你有XML代码要发布吗?可能XML中存在拼写错误或工作时区分大小写…尝试覆盖fatalError、error、warning方法以查看文档中是否存在错误