java - restricción - Cómo obtener el número de línea del error al validar un archivo XML en un esquema XML
validar xml con xsd c# (3)
Intente utilizar un SAXLocator http://download.oracle.com/javase/1.5.0/docs/api/org/xml/sax/Locator.html Los analizadores no están obligados a proporcionar uno, pero si lo hacen debe informar los números de línea
Creo que su código debe incluir:
// this will be called when XML-parser starts reading
// XML-data; here we save reference to current position in XML:
public void setDocumentLocator(Locator locator) {
this.locator = locator;
}
El analizador le dará un localizador que luego puede usar para obtener el número de línea. Probablemente vale la pena imprimir / depurar cuando esto sucede para ver si tienes un localizador válido
Estoy tratando de validar un XML contra un esquema XML de W3C.
El siguiente código hace el trabajo e informa cuando ocurre un error. Pero no puedo obtener el número de línea del error. Siempre devuelve -1.
¿Hay una manera fácil de obtener el número de línea?
import java.io.File;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.w3c.dom.Document;
import org.xml.sax.SAXParseException;
public class XMLValidation {
public static void main(String[] args) {
try {
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(new File("myxml.xml"));
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new File("myschema.xsd"));
Schema schema = factory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.validate(new DOMSource(document));
} catch (SAXParseException e) {
System.out.println(e.getLineNumber());
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Puedes simplemente coger una SaxException e
. Y luego llame a e.toString()
Te dará algo como:
org.xml.sax.SAXParseException; lineNumber: 2668151; columnNumber: 80; La secuencia de caracteres "]]>" no debe aparecer en el contenido a menos que se use para marcar el final de una sección CDATA.
encontré esto
http://www.herongyang.com/XML-Schema/Xerces2-XSD-Validation-with-XMLReader.html
que parece proporcionar los siguientes detalles (para incluir los números de línea)
Error:
Public ID: null
System ID: file:///D:/herong/dictionary_invalid_xsd.xml
Line number: 7
Column number: 22
Message: cvc-datatype-valid.1.2.1: ''yes'' is not a valid ''boolean''
value.
usando este código:
/**
* XMLReaderValidator.java
* Copyright (c) 2002 by Dr. Herong Yang. All rights reserved.
*/
import java.io.IOException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
class XMLReaderValidator {
public static void main(String[] args) {
String parserClass = "org.apache.xerces.parsers.SAXParser";
String validationFeature
= "http://xml.org/sax/features/validation";
String schemaFeature
= "http://apache.org/xml/features/validation/schema";
try {
String x = args[0];
XMLReader r = XMLReaderFactory.createXMLReader(parserClass);
r.setFeature(validationFeature,true);
r.setFeature(schemaFeature,true);
r.setErrorHandler(new MyErrorHandler());
r.parse(x);
} catch (SAXException e) {
System.out.println(e.toString());
} catch (IOException e) {
System.out.println(e.toString());
}
}
private static class MyErrorHandler extends DefaultHandler {
public void warning(SAXParseException e) throws SAXException {
System.out.println("Warning: ");
printInfo(e);
}
public void error(SAXParseException e) throws SAXException {
System.out.println("Error: ");
printInfo(e);
}
public void fatalError(SAXParseException e) throws SAXException {
System.out.println("Fattal error: ");
printInfo(e);
}
private void printInfo(SAXParseException e) {
System.out.println(" Public ID: "+e.getPublicId());
System.out.println(" System ID: "+e.getSystemId());
System.out.println(" Line number: "+e.getLineNumber());
System.out.println(" Column number: "+e.getColumnNumber());
System.out.println(" Message: "+e.getMessage());
}
}
}