"Ole Hedegaard" <olhed@tdc.dk> skrev i en meddelelse
news:3fc3cde1$0$124$edfadb0f@dread11.news.tele.dk...
> Jeg har kigget på Xerces dokumentationen, og til min overraskelse lader
det
> til, at det er umuligt at validere et XML-dokument mod et XML Schema (XSD)
> hvis man ikke har en "schemaLocation" (eller noNameSpaceSchemaLocation)
> reference i sit XML-dokument. Kan det virkelig passe?
Ja det mener jeg. Det er jo sådan dokumenter baseret på schema'er fungere, i
modsætning til dokumenter der bruger dtd'er,
hvor dokument deffinitionen står i doctype.
> Basalt set vil jeg validere noget "fremmed" XML, dvs. noget jeg ikke selv
er
> herre over, og derfor ikke kan sætte XSD-henvisninger ind i, mod nogle
> XSD'er jeg selv har fabrikeret.
Selvfølgelig kan du det. Hvis du stoler på dine schema'er er korrekte, skal
du bare lave en preparsning
efterfulgt af en parsning med fuld validering mod dit schema.
> Kan det passe, at dette ikke kan lade sig gøre med Xerces, eller har jeg
> overset noget?
Nej og ja
Følgende kode stump skulle gøre tricket:
package dk.krconsulting.xml.schema;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.apache.xerces.parsers.DOMParser;
import org.apache.xml.serialize.XMLSerializer;
import org.apache.xml.serialize.OutputFormat;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.IOException;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
public class ExternalValidation {
public static void main(String args[]) {
DOMParser parser = new DOMParser();
DOMParser preparser = new DOMParser();
try {
preparser.parse(new
InputSource("file:///code/schemavalidation/xml/my-xml-file.xml")); // Godt
så, der er XML i filen
Document doc = preparser.getDocument();
Element elem = doc.getDocumentElement();
elem.setAttribute("xmlns:xsi",
"
http://www.w3.org/2001/XMLSchema-instance"); // Lad os lade som om det
er et schema
elem.setAttribute("xsi:noNamespaceSchemaLocation",
"file:///code/schemavalidation/xsd/my-schema.xsd"); // Og validere mod det
her schema
String document = documentToString(doc);
System.out.println(document);
System.out.println("preparsing ended");
// Så skal den bare have fuld skrue med valideringer.
parser.setProperty("
http://apache.org/xml/properties/dom/document-class-name
", "org.apache.xerces.dom.DocumentImpl");
parser.setFeature("
http://apache.org/xml/features/dom/defer-node-expansion",
true);
parser.setFeature("
http://apache.org/xml/features/dom/include-ignorable-whit
espace", true);
parser.setFeature("
http://apache.org/xml/features/validation/schema",
true);
parser.setFeature("
http://apache.org/xml/features/validation/schema-full-che
cking", true);
parser.setFeature("
http://xml.org/sax/features/validation", true);
parser.parse(inputSourceFromString(document)); // Woohoo - det lykkedes.
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static String documentToString(Document doc) {
return documentToString(doc, "ISO-8859-1");
}
public static String documentToString(Document doc, String encoding) {
OutputFormat format = new OutputFormat(doc, encoding, true);
format.setIndent(4);
ByteArrayOutputStream out = new ByteArrayOutputStream();
XMLSerializer serial = new XMLSerializer(out, format);
try {
serial.asDOMSerializer();
serial.serialize(doc.getDocumentElement());
} catch (IOException e) {
}
return out.toString();
}
public static InputSource inputSourceFromString(String xml) {
return new InputSource(new ByteArrayInputStream(xml.getBytes()));
}
}
My-schema.xsd er:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="
http://www.w3.org/2001/XMLSchema">
<xs:element name="node" type="nodetype"/>
<xs:complexType name="nodetype">
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="subnode" type="xs:string"/>
</xs:choice>
</xs:sequence>
<xs:attribute name="name" type="xs:string"/>
</xs:complexType>
</xs:schema>
My-xml-file.xml er:
<?xml version="1.0" encoding="ISO-8859-1"?>
<node name="a name">
<subnode>this is a subnode</subnode>
<subnode>this is another subnode</subnode>
</node>
Håber du kan komme videre :)
--
hilsen Kristian
http://www.krconsulting.dk