SAX in Verwendung mit einer XML Schema Definition (xsd)

Romsl

Erfahrenes Mitglied
Hi,

ist es möglich die SAX API zur Validierung von xsd geschriebenen xml Dateien zu verwenden?

Also in der Art:

Code:
SAXReader saxReader = new SAXReader(true);
saxReader.setEntityResolver(Der spezifische EntityResolver);

Code:
<?xml version="1.0" encoding="ISO-8859-1"?>

<persons xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com persons.xsd">

    <person action="new,update" key="rro">
        <firstname>Romsl</firstname>
        <lastname><![CDATA[Romsl & Romsl]]></lastname>
    </person>

</persons>

Gruß

Romsl
 
Hi,
ich muss erstmal sagen, dass ich nicht viel Ahnung von XML Files habe.
Wenn ich dich richtig verstehe, willst du nur die richtige "Syntax" des XML Files testen. Also z.B. suchen, ob alle geöffneten Tags auch wieder geschlossen werden. Wenn ja, würde ich folgendes machen.

Code:
    public void startElement(String uri, String name, String qName, Attributes att) {
        //hier testest du einfach die qName. Also z.B.
        if(qName.equals("person")) {
           //nichts machen
       }
    }//startElement
    

    public void endElement(String uri, String name, String qName) {
         //hier das selbe machen wie bei startElement
    }//endElement

Code:
XMLHandler handler = new XMLHandler();
String file = "wo es auch immer liegt";
 try {
       SAXParserFactory factory = SAXParserFactory.newInstance();
       SAXParser saxParser = factory.newSAXParser();
       saxParser.parse(file, handler);            
       }//try

       catch (Throwable t) {
          log.error("Fehler XML Parsen: "+t);
       }//catch

Da du ja den XMLHandler im try - catch Block hast, wird bei einem Fehler eine Exception geworfen.
Ich hoffe ich konnte helfen.
 
Hi,

ich möchte ein XML File vor dem parsen mit dom4j oder auch SAX gegenüber einem gegebenen XML Schema validieren lassen. So wie das auch schon mit einer DTD geschieht möchte ich das eben reziprok für XML Schemas anwenden.

Gruß

Romsl
 
Hi,

ich habe bis jetzt probiert etwas zu stande zu bekommen, aber es will einfach nicht. Das fängt schon bei der Definition bzw. dem Referenzieren der XSD im XML File an.

Hat jemand ein simples Beispiel mit einer XML File und einer zugehörigen XSD, incl. der zugehörigen Validierung mit SAX oder domj4.

Gruß

Romsl
 
Hallo!

Schau mal hier:
Code:
/**
 * 
 */
package de.tutorials;

import java.io.File;

import org.dom4j.io.SAXReader;

/**
 * @author Tom
 * 
 */
public class ValidatingSAXParser {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        SAXReader saxReader = new SAXReader(true);
        saxReader.setFeature(
                "http://apache.org/xml/features/validation/schema", true);
        org.dom4j.Document document = saxReader.read(new File(
                "d:/xml/example.xml"));
        System.out.println(document.asXML());
    }
}

... wenn ich in dem genannten Beispiel:
Das root Element wie folgt definiere:
Code:
<rmv xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///d:/xml/example.xsd">
klappt's wunderbar :)

Gruss Tom
 
Hi,

danke nochmal für das Beispiel. Es steht in dieser Spezifikation zwar, dass ich einen LSResourceResolver setzen kann - dieser soll die Funktionalität eines EntityResolvers haben, aber leider wird dieser nie gerufen.

Wie kann ich über Schema.newValidator(...) -> validator.validate(...) das xsd Schema vom Classpath oder Filesystem laden ohne dieses Schema in der XML zu definieren?

Gruß

Romsl
 
Hi,

der EntityResolver wird dann gerufen wenn man das Feature

Code:
http://apache.org/xml/features/validation/schema

auf "true" setzt. So wie Tom es oben gezeigt hat :suspekt: :suspekt: :suspekt: :suspekt: :suspekt:

Danke Tom

Gruß

Romsl
 
Zurück