閱讀完this之後,我一直在試圖實現由RelaxNG XML驗證器(Jing)使用的自定義數據類型。我已經通過命令行成功運行了由Jing提供的示例實現(他們稱之爲datatype-sample
),但我一直未能從java代碼中完成它。Jing RelaxNG驗證器和java代碼中的自定義數據類型庫
從命令行(視窗):
> set CLASSPATH=path\to\jing-20091111\bin\jing.jar;path\to\jing-20091111\sample\datatype\datatype-sample.jar
> cd path\to\jing-20091111\sample\datatype
> java com.thaiopensource.relaxng.util.Driver datatype-sample.rng valid.xml
驗證沒有任何問題進行。但現在我想從下面的Java代碼使用相同的數據類型庫:
package rngdatatype;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;
public class Main {
public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException, SAXException, IOException {
// make sure our jars are on classpath
System.out.println("Classpath: " + System.getProperty("java.class.path"));
// args
String rng = args[0];
String xml = args[1];
File rngFile = new File(rng);
File xmlFile = new File(xml);
// setup rng validator through JAXP
System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.XMLSyntaxSchemaFactory");
SchemaFactory rngSchemaFactory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);
// obtain a schema object
InputStreamReader rngReader = new InputStreamReader(new FileInputStream(rngFile), "UTF-8");
Schema schema = rngSchemaFactory.newSchema(new StreamSource(rngReader));
// validate using schema based validator
Validator validator = schema.newValidator();
InputStreamReader xmlReader = new InputStreamReader(new FileInputStream(xmlFile), "UTF-8");
validator.validate(new StreamSource(xmlReader));
}
}
有了第一個參數是與以下內容的文件的路徑:
<element name="balancedString"
xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.thaiopensource.com/relaxng/datatypes/sample">
<data type="balancedString"/>
</element>
,第二個參數被以下內容的文件的路徑:
<balancedString>foo(bar(baz))</balancedString>
這給了我下面的輸出:
Classpath: path\to\RNGDataType\lib\datatype-sample.jar;path\to\RNGDataType\lib\jing.jar;path\to\RNGDataType\build\classes;path\to\RNGDataType\src
Exception in thread "main" org.xml.sax.SAXParseException: datatype library "http://www.thaiopensource.com/relaxng/datatypes/sample" not recognized
...
這清楚地表明數據類型無法解析。就我所知,滿足此要求的唯一要求(在類路徑上同時具有jing.jar
和datatype-sample.jar
)已得到滿足。那麼我做錯了什麼?
P.S:上面的代碼工作,你必須把jing.jar
和datatype-sample.jar
在CLASSPATH並提供論據它放在第一個是路徑datatype-sample.rng
,第二個是路徑valid.xml
或invalid.xml
。所有這些都與Jing分銷。
EDIT1:上面的程序也沒有我的IDE之外時爲JAR(java -jar
)用適當的MANIFEST.MF
文件運行工作。類路徑手動設置時也不起作用(java -classpath
)。所以我懷疑實際的代碼有問題。
它已經這樣做了。正如解釋的'datatype-sample.jar'是Jing的實現者的一個示例數據類型庫實現,它具有您的建議。否則,從命令行運行示例也不起作用。 – predi