Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2009, 18:18   #1
stan90
Новичок
Джуниор
 
Регистрация: 28.11.2009
Сообщений: 1
По умолчанию как проверить заголовок XML?

у меня есть синтаксический анализатор 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);
}
}
stan90 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
парсер XML, не видит XML тэги supercelt PHP 3 02.11.2009 19:18
Как Как проверить кнопки мыши без OnMouseDown? Вадим Буренков Общие вопросы Delphi 3 22.05.2009 15:08
Как сделать так, чтобы форму можно было тостать не только за заголовок? Никки Общие вопросы Delphi 1 04.09.2008 14:34
Как работать с XML? Никки Общие вопросы Delphi 7 18.01.2008 00:56
Как скрыть заголовок окна? 1nurik1 Общие вопросы Delphi 4 28.05.2007 11:26