Java SAX解析器不调用start元素
我试图执行下面的代码,但我的SAX解析器没有调用startElement方法 下面是我的代码: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
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方法以查看文档中是否存在错误