2012-10-26 41 views
2

我有一些错误的XML文档 - 有时结束标记丢失 - 我想找到发生这种情况的地方并修复它们(手动)。如何使用Java在XML中查找未封闭标签?

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

我可以写我自己的解析器,这有助于做到这一点,但我不知道是否已经有解决方案?我不想自动整理,因为我想确保将结束标记插入正确的位置。我只想知道开始标记的行号。

+0

你可以找到,也许一些有用的信息在这里:http://stackoverflow.com/questions/373833/best-xml-parser-for-java – Naytzyrhc

+0

谢谢。你知道任何报告行号的SAX解析器吗? –

+0

@aetheria XMLEventReader报告有关行号。 – user1516873

回答

2

我认为它很简单,可以在没有任何第三方库的情况下完成。 Java有标准类 javax.xml.stream.XMLEventReader,并且它会在找到错过的结束标记时抛出XMLException。然后致电e.getLocation().getLineNumber()获取行号。

有点complecated样本:

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; 
     } 
    } 
相关问题