我有一些錯誤的XML文檔 - 有時結束標記丟失 - 我想找到發生這種情況的地方並修復它們(手動)。如何使用Java在XML中查找未封閉標籤?
我用XOM解析文檔,它在適當的時候輕鬆地說「缺少結束標籤」,並告訴我元素的名稱,但並不能很好地指導問題出在哪裏文件。
我可以寫我自己的解析器,這有助於做到這一點,但我不知道是否已經有解決方案?我不想自動整理,因爲我想確保將結束標記插入正確的位置。我只想知道開始標記的行號。
我有一些錯誤的XML文檔 - 有時結束標記丟失 - 我想找到發生這種情況的地方並修復它們(手動)。如何使用Java在XML中查找未封閉標籤?
我用XOM解析文檔,它在適當的時候輕鬆地說「缺少結束標籤」,並告訴我元素的名稱,但並不能很好地指導問題出在哪裏文件。
我可以寫我自己的解析器,這有助於做到這一點,但我不知道是否已經有解決方案?我不想自動整理,因爲我想確保將結束標記插入正確的位置。我只想知道開始標記的行號。
我認爲它很簡單,可以在沒有任何第三方庫的情況下完成。 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;
}
}
你可以找到,也許一些有用的信息在這裏:http://stackoverflow.com/questions/373833/best-xml-parser-for-java – Naytzyrhc
謝謝。你知道任何報告行號的SAX解析器嗎? –
@aetheria XMLEventReader報告有關行號。 – user1516873