у меня есть синтаксический анализатор XML файла,но у меня получилось сделать только чтобы он проверял открывающиеся и закрывающиеся теги и показывал номер позиции где ошибка...
подскажите пожалуйста как сделать проверку для заголовка?
Код:
import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class XMLParser {
protected int curPos = 0;
protected BufferedReader inputText;
protected Stack<XMLTag> stack = new Stack<XMLTag>();
private String errorMessage;
private Object oldCurrPos;
public boolean parse(BufferedReader inputText) throws IOException {
this.inputText = inputText;
curPos = 0;
boolean result = parseHeader();
return result ? parseTag() : false;
}
protected boolean parseHeader() {
return true;
}
protected boolean parseTag() throws IOException {
skipWS();
boolean result = parseOTag();
if (!result)
return false;
do {
skipToDelimeters("<");
if (testStart("</"))
return parseCTag();
if (testStart("<")) {
if (!parseTag())
return false;
} else
return false;
} while (true);
}
protected boolean parseOTag() throws IOException {
skipWS();
if (!testStart("<"))
return false;
if (testStart("</"))
return false;
int c = inputText.read();
curPos++;
XMLTag tag = new XMLTag(skipToDelimeters("> \n\t"));
stack.push(tag);
if (!testStart(">"))
if (!parseParams(tag))
return false;
c = inputText.read();
if (c != 13)
curPos++;
if (c == '>')
return true;
else
return false;
}
protected boolean parseParams(XMLTag tag) throws IOException {
skipToDelimeters(">");
return true;
}
protected boolean parseCTag() throws IOException {
skipWS();
if (!testStart("</"))
return false;
inputText.skip(2);
curPos+=2;
XMLTag tag = stack.pop();
if (!tag.name.equals(skipToDelimeters(">")))
return false;
int c = inputText.read();
if (c != 13)
curPos++;
if (c == '>')
return true;
else
return false;
}
public boolean testStart(String str) throws IOException {
int len = str.length();
char[] cbuf = new char[len];
inputText.mark(len);
len = inputText.read(cbuf, 0, len);
inputText.reset();
if (len == -1)
return false;
String sbuf = new String(cbuf, 0, len);
if (sbuf.compareToIgnoreCase(str) == 0)
return true;
else
return false;
}
protected void skipWS() throws IOException {
int c;
do {
inputText.mark(1);
c = inputText.read();
if (c != 13)
curPos++;
} while (Character.isWhitespace(c));
inputText.reset();
curPos--;
}
protected String skipToDelimeters(String delimeters) throws IOException {
int c;
StringBuffer sb = new StringBuffer();
do { // в цикле
inputText.mark(1);
c = inputText.read();
if (delimeters.indexOf(c) == -1 && c != -1) {
sb.append((char) c);
curPos++; // и увеличиваем счетчик прочитанных символов (по
// условию (c != 13) см. метод skipWS())
} else
break; // иначе выйдем из цикла
} while (true);
inputText.reset(); // последний символ присутствовал в строке
// delimeters, возвратим поток в исходное положение
return sb.toString().trim(); // вернем в качестве результата считанные в
// буфер sb символы, преобразовав его к
// стоке и обрезав с обеих сторон
// пробельные символы
}
public int getCurPos() {
//Метод getCurPos() расширяет интерфейс класса XMLParser,
//позволяя пользователю узнать положение в потоке ввода (после вызова метода parse()).
return curPos;
}
public static void main(String[] args) throws IOException {
BufferedReader isr = new BufferedReader(new InputStreamReader(//Объект isr класса BufferedReader
//создается для чтения из файла test.txt
// (System.in));
new FileInputStream("test.txt"), "cp1251"));
XMLParser xp = new XMLParser();//Далее создается объект класса XMLParser
//и на экран выводятся результат анализа текста
//(true/false, т.е. успешно/неуспешно) и порядковый номер символа,
//на котором остановилась обработка.
System.out.println(xp.parse(isr));
System.out.println(xp.curPos);
}
}