во время проверки мне нужно имя элемента в исключении

Это файл класса Java.

import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import org.xml.sax.SAXException;
import java.io.*;

public class Jaxp_1
{
public static void main(String [] args) throws Exception
{
Source schemaFile = new StreamSource(new File("xsd/img.xsd"));
Source xmlFile = new StreamSource(new File("xml/imgone.xml"));

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaFile);
Validator validator = schema.newValidator();

try{
        validator.validate(xmlFile);
        System.out.println(xmlFile.getSystemId()+ " is valid");
        System.out.println();
    }
    catch (SAXException e) 
    {
        System.out.println(schemaFile.getSystemId() + " is NOT valid");
        System.out.println("Reason: " + e.getMessage());
    }
 }
 }

Это xml-файл.

<?xml version="1.0" encoding="UTF-8"?>
<edge xmlns="http://www.example.org/img">
<image x="143.05" y="2" height="66" width="537"
    xhref="/dccp_repository/dam/other/images/insurance.jpg" id="Image_48"
    isLocked="false" rx="143.05" ry="2" rotation="0" />
</edge>

это XSD-файл.

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/img"
xmlns:tns="http://www.example.org/img" elementFormDefault="qualified">
<element name="edge">
    <complexType>
        <sequence>
            <element name="image">
                <complexType>
                    <attribute name="x" type="int"></attribute>
                    <attribute name="y" type="int"></attribute>
                    <attribute name="height" type="int"></attribute>
                    <attribute name="width" type="int"></attribute>
                    <attribute name="xhref" type="string"></attribute>
                    <attribute name="id" type="string"></attribute>
                    <attribute name="isLocked" type="string"></attribute>
                    <attribute name="rx" type="double"></attribute>
                    <attribute name="ry" type="int"></attribute>
                    <attribute name="rotation" type="int"></attribute>
                </complexType>
            </element>
        </sequence>
    </complexType>
</element>
</schema>

Я изменил тип атрибута, например имя атрибута = "x" type = "int". я получил ошибку, как:

file:/D:/Maheshkumar.V/workspace/JavaOne/JavaIO/xsd/img.xsd НЕдействителен. Причина: cvc-datatype-valid.1.2.1: '143.05' не является допустимым значением для 'integer '.

он не будет отображать имя элемента в исключении. где целое? это не конкретный элемент «изображение».

если бы у меня был большой xml. как я могу определить ошибку?


person Maheshkumar.V    schedule 20.03.2014    source источник


Ответы (1)


Возникающее исключение — это SAXParseException, подкласс SAXException. SAXException не может сказать вам, где произошла ошибка, но SAXParseException может через getLineNumber() и getColumnNumber(). Они не называют неисправный элемент, но позволяют идентифицировать его по его расположению в XML-файле. Номер строки и столбца указывает на закрывающий тег элемента.

Вы можете использовать это:

try{
    validator.validate(xmlFile);
    System.out.println(xmlFile.getSystemId()+ " is valid");
    System.out.println();
} catch (SAXParseException e) 
{
    System.out.println(schemaFile.getSystemId() + " is NOT valid");
    System.out.println("Reason: " + e.getMessage() 
         + " at line:" + e.getLineNumber() 
         + " at column:" + e.getColumnNumber() +".");
} catch (SAXException e) 
{
    System.out.println(schemaFile.getSystemId() + " is NOT valid");
    System.out.println("Reason: " + e.getMessage());
}
person tassaert.l    schedule 20.03.2014
comment
› у меня работает. Можно ли получить имя элемента? - person Maheshkumar.V; 20.03.2014