/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Xerces schema-validering
Fra : Ole Hedegaard


Dato : 25-11-03 22:47

Hej,

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?

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.

Kan det passe, at dette ikke kan lade sig gøre med Xerces, eller har jeg
overset noget?

Mvh.
Ole Hedegaard



 
 
Kristian Rasmussen (30-11-2003)
Kommentar
Fra : Kristian Rasmussen


Dato : 30-11-03 15:44

"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




Michael (05-12-2003)
Kommentar
Fra : Michael


Dato : 05-12-03 23:47

Hej,

> 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.

Der er så vidt jeg husker en mulighed for at gøre det med JAXP. Noget i stil
med:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

dbf.setNamespaceAware(true);
dbf.setValidating(true);

try {
dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
} catch (IllegalArgumentException x) {
// This can happen if the parser does not support JAXP 1.2
...
}

// Specify other factory configuration settings
dbf.setAttribute(JAXP_SCHEMA_SOURCE, new File(schemaSource)); // <---
Her!
...
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new InputSource( .... yada yada yada

Det er ikke testet så du må eksperimentere dig lidt frem.

Mvh Michael
www.hyperpal.com


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408918
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste