2012-09-06 85 views
0

我有一個很大的xml文件需要針對大的XSD進行驗證。當存在驗證錯誤時,客戶端要求我填充具有不同數據值的表格。例如,如果學生證無效,我會顯示學區,區域和學生證。在XML的另一部分,如果狀態無效,我將顯示學校名稱,州和地區。要顯示的數據因無效數據而異。但是應該提取其作爲無效子元素父母的兩三四個元素。從失敗的XML中獲取元素

如何使用XMLSTREAMREADER和Validator提取數據?

我想這個,我可以只得到無效的元素沒有其他數據等

public class StaxReaderWithElementIdentification { 

private static final StreamSource XSD = new StreamSource("files\\InterchangeEducationOrganizationExension.xsd"); 
private static final StreamSource XML = new StreamSource("files\\InterchangeEducationOrganizationExension.xml"); 

public static void main(String[] args) throws Exception { 
    SchemaFactory factory=SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Schema schema = factory.newSchema(XSD); 

    XMLStreamReader reader = XMLInputFactory.newFactory().createXMLStreamReader(XML); 
    Validator validator = schema.newValidator(); 
    validator.setErrorHandler(new MyErrorHandler(reader)); 
    validator.validate(new StAXSource(reader)); 

} 
} 

和處理程序是:

public class MyErrorHandler implements ErrorHandler { 

private XMLStreamReader reader; 

public MyErrorHandler(XMLStreamReader reader) { 
    this.reader = reader; 
} 

@Override 
public void error(SAXParseException e) throws SAXException { 
    warning(e); 
} 

@Override 
public void fatalError(SAXParseException e) throws SAXException { 
    warning(e); 
} 

@Override 
public void warning(SAXParseException e) throws SAXException { 
    //System.out.println(reader.getProperty(name)); 
    System.out.println(reader.getLocalName()); 
    System.out.println(reader.getNamespaceURI()); 
    e.printStackTrace(System.out); 
    } 

} 

誰能幫我,我怎麼能提取其他數據何時出現驗證錯誤?

回答

1

我不確定這是最佳解決方案,但您可以嘗試使用HTML EditorKit並實施自定義ParserCallback

通過這種方式,您可以解析文檔並僅對您感興趣的標籤作出反應。它將咀嚼任何XML/HTML,無論它是多麼無效。