如何使用Java在XML中查找未闭合的标签?

我有一些错误的XML文档 – 有时结束标记丢失 – 我想找到发生这种情况的地方并修复它们(手动)。

我已经使用XOM来解析文档,它在适当的时候轻松地说“缺少结束标记”,并告诉我元素的名称,但不能很好地指导我在文件中的问题所在。

我可以编写自己的解析器来帮助完成此操作,但我想知道是否已有解决方案? 我不想自动整理,因为我想确保在正确的位置插入结束标签。 我只想知道开始标记的行号。

我认为这很简单,可以在没有任何第三方库的情况下完成。 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 stack = new Stack(); 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; } } 

XMLEventReader可以帮助您解决问题:

看下面的文章:

链接: http : //tutorials.jenkov.com/java-xml/stax-xmleventreader.html