git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273307 13f79535-47bb-0310-9956-ffa450edef68master
@@ -9,14 +9,17 @@ | |||
<h2><a name="xmlvalidate">XMLValidate</a></h2> | |||
<h3>Description</h3> | |||
<p>This task checks xml files are valid (or only well formed). The | |||
<p>This task checks XML files are valid (or only well formed). The | |||
task uses the SAX2 parser implementation provided by JAXP by default | |||
(probably the one that is used by Ant itself), but one can specify any | |||
SAX1/2 parser if needed.</p> | |||
(usually the one that is used by Ant itself), but one can specify any | |||
SAX1/2 parser if needed. Ant ships with Xerces, which is also what is built in | |||
to Java 1.4: XML parsers built into the runtime override Ant's choice.</p> | |||
<p>This task supports the use of nested <a | |||
href="../CoreTypes/xmlcatalog.html">xmlcatalog</a> elements and/or nested | |||
<tt><dtd></tt> elements which are used to resolve DTDs and entities.</p> | |||
<p>This task supports the use of nested | |||
<li/><a href="../CoreTypes/xmlcatalog.html"><tt><xmlcatalog></tt></a> elements | |||
<li/><tt><dtd></tt> elements which are used to resolve DTDs and other entities. | |||
<li/><tt><feature></tt> elements which are used to set features. These can be any number of <a href="http://www.saxproject.org/apidoc/org/xml/sax/package-summary.html#package_description">http://xml.org/sax/features/</a> | |||
</p> | |||
<h3>Parameters</h3> | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
@@ -62,7 +65,7 @@ href="../CoreTypes/xmlcatalog.html">xmlcatalog</a> elements and/or nested | |||
<h3><a name="nested">Nested Elements</a></h3> | |||
<h4>dtd</h4> | |||
<dtd> is used to specify different locations for DTD resolution. | |||
<dtd> is used to specify different locations for DTD and entity resolution. | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
<tr> | |||
<td width="12%" valign="top"><b>Attribute</b></td> | |||
@@ -84,10 +87,17 @@ href="../CoreTypes/xmlcatalog.html">xmlcatalog</a> elements and/or nested | |||
<h4>xmlcatalog</h4> | |||
<p>The <a href="../CoreTypes/xmlcatalog.html">xmlcatalog</a> | |||
element is used to perform Entity resolution.</p> | |||
<h4>feature</h4> | |||
<p>The feature element is used to set SAX Parser features. | |||
A feature essentialy changes the mode of the parser. | |||
There can be an arbitrary amount of features set as defined here: | |||
<a href="http://www.saxproject.org/apidoc/org/xml/sax/package-summary.html#package_description">http://xml.org/sax/features/</a> | |||
</p> | |||
<h3>Examples</h3> | |||
<blockquote><pre> | |||
<pre> | |||
<xmlvalidate file="toto.xml"/> | |||
<xmlvalidate failonerror="no" lenient="yes" warn="yes" | |||
@@ -95,16 +105,28 @@ element is used to perform Entity resolution.</p> | |||
classpath="lib/xerces.jar"> | |||
<fileset dir="src" includes="style/*.xsl"/> | |||
</xmlvalidate> | |||
</pre> | |||
Validate all .xsl files in src/style, but only warn if there is an error, rather than | |||
halt the build. | |||
<pre> | |||
<xmlvalidate file="struts-config.xml" warn="false"> | |||
<dtd publicId="-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" | |||
location="struts-config_1_0.dtd"/> | |||
</xmlvalidate> | |||
</pre> | |||
Validate a struts configuration, using a local copy of the DTD. | |||
<pre> | |||
<xmlvalidate failonerror="no"> | |||
<fileset dir="${project.dir}" includes="**/*.xml"/> | |||
<xmlcatalog refid="mycatalog"/> | |||
</xmlvalidate> | |||
</pre> | |||
Scan all XML files in the project, using a predefined catalog to map URIs to local files. | |||
<pre> | |||
<xmlvalidate failonerror="no"> | |||
<fileset dir="${project.dir}" includes="**/*.xml"/> | |||
@@ -114,7 +136,23 @@ element is used to perform Entity resolution.</p> | |||
location="com/arielpartners/knowledgebase/dtd/article.dtd"/> | |||
</xmlcatalog> | |||
</xmlvalidate> | |||
</pre></blockquote> | |||
</pre> | |||
Scan all XML files in the project, using the catalog defined inline. | |||
<pre> | |||
<xmlvalidate failonerror="yes" lenient="no" warn="yes"> | |||
<fileset dir="xml" includes="**/*.xml"/> | |||
<feature name="http://xml.org/sax/features/validation" value="true"/> | |||
<feature name="http://apache.org/xml/features/validation/schema" value="true"/> | |||
</xmlvalidate> | |||
</pre> | |||
Validate the XML files using XML Schema validation. | |||
<hr> | |||
<p align="center">Copyright © 2001-2002 Apache Software Foundation. All rights | |||
@@ -58,9 +58,10 @@ import java.io.FileReader; | |||
import java.io.IOException; | |||
import java.net.MalformedURLException; | |||
import java.net.URL; | |||
import java.util.Enumeration; | |||
import java.util.Hashtable; | |||
import java.util.Vector; | |||
import java.util.List; | |||
import java.util.LinkedList; | |||
import org.apache.tools.ant.AntClassLoader; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.DirectoryScanner; | |||
@@ -89,6 +90,8 @@ import org.xml.sax.helpers.ParserAdapter; | |||
* (probably the one that is used by Ant itself), but one can specify any | |||
* SAX1/2 parser if needed | |||
* @author Raphael Pierquin <a href="mailto:raphael.pierquin@agisphere.com">raphael.pierquin@agisphere.com</a> | |||
* @author <a href="mailto:nick.pellow@mindmatics.de">Nick Pellow</a> | |||
* Added support for setting features. | |||
*/ | |||
public class XMLValidateTask extends Task { | |||
@@ -106,8 +109,7 @@ public class XMLValidateTask extends Task { | |||
protected Vector filesets = new Vector(); // sets of file to be validated | |||
protected Path classpath; | |||
/** | |||
/** | |||
* the parser is viewed as a SAX2 XMLReader. If a SAX1 parser is specified, | |||
* it's wrapped in an adapter that make it behave as a XMLReader. | |||
* a more 'standard' way of doing this would be to use the JAXP1.1 SAXParser | |||
@@ -116,7 +118,8 @@ public class XMLValidateTask extends Task { | |||
protected XMLReader xmlReader = null; // XMLReader used to validation process | |||
protected ValidatorErrorHandler errorHandler | |||
= new ValidatorErrorHandler(); // to report sax parsing errors | |||
protected Hashtable features = new Hashtable(); | |||
private List featureList = new LinkedList(); | |||
private XMLCatalog xmlCatalog = new XMLCatalog(); | |||
@@ -222,6 +225,17 @@ public class XMLValidateTask extends Task { | |||
filesets.addElement(set); | |||
} | |||
/** | |||
* add a feature nested element | |||
* @since ant1.6 | |||
*/ | |||
public Feature createFeature() { | |||
final Feature feature = new Feature(); | |||
featureList.add(feature); | |||
return feature; | |||
} | |||
public void init() throws BuildException { | |||
super.init(); | |||
xmlCatalog.setProject(getProject()); | |||
@@ -347,18 +361,18 @@ public class XMLValidateTask extends Task { | |||
+ " doesn't provide validation"); | |||
} | |||
} | |||
// set other features | |||
Enumeration enum = features.keys(); | |||
while (enum.hasMoreElements()) { | |||
String featureId = (String) enum.nextElement(); | |||
setFeature(featureId, ((Boolean) features.get(featureId)).booleanValue(), true); | |||
// set the feature from the feature list | |||
for (int i = 0; i < featureList.size(); i++) { | |||
Feature feature = (Feature) featureList.get(i); | |||
setFeature(feature.getFeatureName(), | |||
feature.getFeatureValue(), | |||
true); | |||
} | |||
} | |||
} | |||
/** | |||
* set a feature on the parser. | |||
* @todo find a way to set any feature from build.xml | |||
* Set a feature on the parser. | |||
*/ | |||
private boolean setFeature(String feature, boolean value, boolean warn) { | |||
@@ -482,4 +496,53 @@ public class XMLValidateTask extends Task { | |||
return e.getMessage(); | |||
} | |||
} | |||
/** | |||
* The class to create to set a feature of the parser. | |||
* @since ant1.6 | |||
* @author <a href="mailto:nick.pellow@mindmatics.de">Nick Pellow</a> | |||
*/ | |||
public class Feature { | |||
/** The name of the feature to set. | |||
* | |||
* Valid features <a href=http://www.saxproject.org/apidoc/org/xml/sax/package-summary.html#package_description">include.</a> | |||
*/ | |||
private String featureName = null; | |||
/** | |||
* The value of the feature. | |||
**/ | |||
private boolean featureValue; | |||
/** | |||
* Set the feature name. | |||
* @param name the name to set | |||
*/ | |||
public void setName(String name) { | |||
featureName = name; | |||
} | |||
/** | |||
* Set the feature value to true or false. | |||
* @param value | |||
*/ | |||
public void setValue(boolean value) { | |||
featureValue = value; | |||
} | |||
/** | |||
* Gets the feature name. | |||
* @return the feature name | |||
*/ | |||
public String getFeatureName() { | |||
return featureName; | |||
} | |||
/** | |||
* Gets the feature value. | |||
* @return the featuree value | |||
*/ | |||
public boolean getFeatureValue() { | |||
return featureValue; | |||
} | |||
} | |||
} |