XML の生成に使用される XSD に従って名前空間プレフィックスを管理する方法は? maven を使用して3つの異なるXSDファイルがあり、jaxb2-maven-plugin
Javaクラスも生成できます。しかし、対応するスキーマに従って特定の名前空間プレフィックスを持つ XML ファイルを生成できません。以下は、私の jaxb2marshaller 構成です。
@Bean
public Marshaller ltiMarshaller() {
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
Map<String,Object> map = new HashMap<String,Object>();
map.put("jaxb.formatted.output", true);
map.put("com.sun.xml.bind.namespacePrefixMapper", new ManifestNamespaceMapper());
jaxb2Marshaller.setMarshallerProperties(map);
jaxb2Marshaller.setContextPaths(
"com.abc.xyz.generated.basicltilink",
"com.abc.xyz.generated.lommanifest",
"com.abc.xyz.generated.lomresource",
"com.abc.xyz.generated.manifest",
"com.instructure.canvas.xsd.cccv1p0"
);
return jaxb2Marshaller;
}
以下は私のManifestNamespaceMapper.java
public class ManifestNamespaceMapper extends NamespacePrefixMapper {
private Map<String, String> prefixMap = new HashMap<String, String>();
public ManifestNamespaceMapper() {
prefixMap.put("http://www.imsglobal.org/xsd/imsccv1p3/imsccauth_v1p3", "auth");
prefixMap.put("http://ltsc.ieee.org/xsd/imsccv1p3/LOM/manifest", "lomimscc");
prefixMap.put("http://www.imsglobal.org/xsd/imsccv1p3/imscp_v1p1", "");
prefixMap.put("http://www.imsglobal.org/xsd/imsccv1p3/imscsmd_v1p0", "csm");
prefixMap.put("http://ltsc.ieee.org/xsd/imsccv1p3/LOM/resource", "resource");
prefixMap.put("http://www.w3.org/2001/XMLSchema-instance", "xsi");
prefixMap.put("http://canvas.instructure.com/xsd/cccv1p0", "assignment");
}
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion,
boolean requirePrefix) {
return prefixMap.get(namespaceUri);
}
}
生成された XML スニペットは次のとおりです。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns9:manifest xmlns="http://ltsc.ieee.org/xsd/imsccv1p3/LOM/imscclti"
xmlns:ns2="http://www.imsglobal.org/xsd/imsccv1p2/imscsmd_v1p0"
xmlns:ns3="http://www.imsglobal.org/xsd/imsbasiclti_v1p0" xmlns:ns4="http://www.imsglobal.org/xsd/imslticm_v1p0"
xmlns:ns5="http://www.imsglobal.org/xsd/imslticp_v1p0" xmlns:ns6="http://www.imsglobal.org/xsd/imslticc_v1p2"
xmlns:ns7="http://ltsc.ieee.org/xsd/imsccv1p3/LOM/manifest" xmlns:ns8="http://ltsc.ieee.org/xsd/imsccv1p3/LOM/resource"
xmlns:ns9="http://www.imsglobal.org/xsd/imsccv1p3/imscp_v1p1"
xmlns:ns10="http://www.imsglobal.org/xsd/imsccv1p3/imscsmd_v1p0"
xmlns:ns11="http://www.imsglobal.org/xsd/imsccv1p3/imsccauth_v1p3"
xmlns:ns12="http://canvas.instructure.com/xsd/cccv1p0" identifier="abcd1234">
<ns9:metadata>
<ns9:schema>IMS Common Cartridge</ns9:schema>
<ns9:schemaversion>1.3.0</ns9:schemaversion>
<ns7:lom>....
したがって、上記の生成された XML を見ると、ここに属していない多くの名前空間があることがわかります。それらは、異なる XSD ファイルのために別の XML に属しています。他の生成された XML ファイルの場合も同様で、すべての名前空間が挿入されていることがわかります。
JAXB2Marshaller がすべてをすべてのファイルにコピーする理由がわかりません。各 XML ファイルの名前空間と名前空間プレフィックスを分離する方法はありますか?
アップデート
この問題を回避する 1 つの方法は、ここでJaxb2Marshaller
説明されているように、構成が異なるの複数のインスタンスを作成することです。同様のスレッドで、複数のcontextPathを使用することを提案する回答が 1 つありますが、これは既に行っていますが、役に立ちませんでした。
ありがとう !