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

时间:2012-10-26 08:52:33

标签: java xml

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

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

XMLEventReader可帮助您解决问题:

请看以下文章:

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