これを読んだ後、RelaxNG XMLバリデーター(Jing)で使用されるカスタムデータ型を実装しようとしています。Jing(彼らはそれを呼んでいますdatatype-sample
)によって提供されたサンプル実装をコマンドラインで正常に実行しましたが、Javaコードから実行することに失敗し続けています。
コマンドライン(Windows)から:
> 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>
そして、2番目の引数は次の内容のファイルへのパスです。
<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
)は、私が知る限り満たされています。だから私は何が間違っているのですか?
PS:上記のコードを機能させるにはjing.jar
、datatype-sample.jar
クラスパスに引数を指定し、最初のコードがパスdatatype-sample.rng
で、2番目のコードがパスvalid.xml
またはである引数を指定する必要がありますinvalid.xml
。これらはすべてJingとともに配布されます。
Edit1:java -jar
上記のプログラムは、適切なファイルを使用してJAR()として実行した場合、IDEの外部でも機能しませんMANIFEST.MF
。クラスパスが手動で設定されている場合も機能しません(java -classpath
)。したがって、実際のコードに何か問題があるのではないかと思います。