JAXB 出力では、使用されたすべての名前空間とスキーマの完全な情報が含まれるように、xsi:schemaLocation 属性を設定しようとしています。ハードコーディングするよりも良い方法を見つけようとしています!
約 50 個のファイルにまたがる XML スキーマがあります。各ファイルは型を定義し、独自の名前空間を持ちます。(賢明な決定ではないと思いますが、それを主張するには遅すぎます。) XJC は混乱全体を喜んでコンパイルし、クラスを生成します。出力がマーシャリングされると、50 以上の名前空間がすべて適切にルート要素に配置されます。
問題は、xsi:schemaLocation 属性にすべての名前空間と関連するスキーマ ソースを入力するように求められたことです。したがって、1 つの名前空間と URL のペア (「my.co.schema.v1 http://my.company.com/schemas/my.co.schema.v1.xsd」) ではなく、50 以上のペアを配置する必要があります。そこで。確かにハードコードできますが、それは間違っています。
JAXB が使用したすべてのソースについて JAXB に問い合わせたいのですが、それは不可能のようです。Xerces 文法プールを使用して、すべてのスキーマを再度読み込む必要があると考え始めています。それが最善の選択肢ですか?
以下にSCCEを追加しました。正常に動作しますが、前述したように、xsi:schemaLocation 属性はハードコードされており、不完全です。
助けてください、事前に感謝します。
package my.xml.generator;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import my.schema.ComponentType;
import my.schema.ObjectFactory;
import my.schema.ProductType;
/**
* Builds a JAXB object and serializes to a file.
*
* Many thanks to
* http://blog.bdoughan.com/2010/12/jaxb-and-marshalunmarshal-schema.html
*/
public class SimpleXmlBuilder {
public static void main(String[] argv) throws Exception {
if (argv.length != 1)
throw new IllegalArgumentException(
"Usage: SimpleXmlBuilder output-file-path");
// Create a trivial component
ObjectFactory objectFactory = new ObjectFactory();
ProductType product = objectFactory.createProductType();
product.setDeprecated(true);
// Wrap in a root element
JAXBElement<ProductType> rootElement = objectFactory
.createProduct(product);
// Get JAXB going
Class<?>[] rootElementClass = { ComponentType.class };
JAXBContext context = JAXBContext.newInstance(rootElementClass);
Marshaller marshaller = context.createMarshaller();
// Leave some whitespace for humans
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// The critical part of the problem!
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION,
"My.Name.Space.v1" + " "
+ "http://my.server.com/schemas/My.Name.Space.v1.xsd");
// Write to the named file
marshaller.marshal(rootElement, new File(argv[0]));
System.out.println("Wrote generated XML to " + argv[0]);
}
}