Как найти незамкнутые теги в XML с помощью Java?

У меня есть некоторые XML-документы с ошибками - иногда отсутствуют конечные теги - и я хочу найти места, где это происходит, и исправить их (вручную). I '

мы использовали XOM для разбора документов, и это легко говорит "отсутствующий конечный тег в нужное время, и говорит мне название элемента, но нея очень хорошо покажу, где проблема в файле.

Я мог бы написать свой собственный парсер, который поможет это сделать, но мне интересно, есть лиУже есть решение? Я неЯ не хочу автоматически убирать, так как я хочу убедиться, что конечные теги вставлены в нужное место. Я просто хочу знать номер строки начального тега.

 user151687326 окт. 2012 г., 11:46
@aetheria XMLEventReader сообщает о номере строки.
 ᴇʟᴇvᴀтᴇ26 окт. 2012 г., 11:02
Благодарю. Знаете ли вы какой-либо SAX-парсер, который сообщает номера строк?
 Naytzyrhc26 окт. 2012 г., 10:58
Вы можете найти здесь полезную информацию:stackoverflow.com/questions/373833/best-xml-parser-for-java

Ответы на вопрос(2)

Посмотрите на следующую статью:

Ссылка на сайт :http://tutorials.jenkov.com/java-xml/stax-xmleventreader.html

Решение Вопроса

что это просто и может быть сделано без какой-либо сторонней библиотеки. Java имеет стандартный классjavax.xml.stream.XMLEventReaderи это броситXMLException когда он найдет пропущенный конец тега. Тогда позвониe.getLocation().getLineNumber() чтобы получить номер строки.

немного дополненный образец:

    InputStream is = new FileInputStream("test.xml");
    XMLInputFactory inputFactory = XMLInputFactory.newInstance();
    XMLEventReader eventReader = inputFactory.createXMLEventReader(is, "utf-8");
    Stack<startelement> stack = new Stack<startelement>();
    while (eventReader.hasNext()) {
        try {
            XMLEvent event = eventReader.nextEvent();
            if (event.isStartElement()) {
                StartElement startElement = event.asStartElement();
                System.out.println("processing element: " + startElement.getName().getLocalPart());
                stack.push(startElement);
            }
            if(event.isEndElement()){
                stack.pop();
            }
        }catch(XMLStreamException e){

            System.out.println("error in line: " +e.getLocation().getLineNumber());
            StartElement se = stack.pop();
            System.out.println("non-closed tag:" + se.getName().getLocalPart() + " " + se.getLocation().getLineNumber());

            throw e;
        }
    }
</startelement></startelement>

Ваш ответ на вопрос