在解组时,我在为多个不同的XML文件中的相同前缀设置不同的名称空间URI时遇到了一些麻烦,XML的结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<pdi:company xmlns:rdp="rdp_namespace_uri" xmlns:pdi="pdi_namespace_uri" name="test">
<division rdp:id="id_1" rdp:type="org" name="Financial">data</division>
<division rdp:id="id_2" rdp:type="org" name="Personal">data</division>
</pdi:company>
每个文件结构都相同,只有RDP名称空间和PDI名称空间对于每个XML文件都不同。由于命名空间被定义为静态最终变量,因此一旦设置它就无法更改它。我的Java类看起来像这样:
@XmlRootElement(name = "company", namespace = JAXBProperties.pdiNamespace)
@XmlAccessorType(XmlAccessType.FIELD)
public class Company {
private ArrayList<Division> divisions;
}
和JAXBProperties类:
public class JAXBProperties {
public static final String rdpNamespace = "rdp_namespace_uri";
public static final String pdiNamespace = "pdi_namespace_uri";
}
我需要为每个文件动态更改rdpNamespace和pdiNamespace变量。我怎么能做到这一点?
我无法改变XML本身的结构,例如简单地重写名称空间URI,因为这些XML文件来自不同的源,我应该做的只是将它们解组为对象表示。
我们有一个例子,这个将为严格给出PDI命名空间的company_1.xml定义,如下所示:
@XmlRootElement(name = "company", namespace = "http://www.example.com/PDI_1")
public class Company {
对于另一个文件company_2.xml,名称空间不同(我必须手动重写它):
@XmlRootElement(name = "company", namespace = "http://www.example.com/PDI_2")
public class Company {
每当我尝试解组文件而不将@XmlRootElement中的命名空间更改为其文件的xmlns:pdi标记中的相应命名空间时,我会收到错误,假设我尝试使用PD_1命名空间解组文件company_2.xml:
Exception Description: A descriptor with default root element {http://www.example.com/PDI_2}company was not found in the project]
当我手动将@XmlRootElement中的命名空间更改为PD_2时,一切正常。我想动态更新@XmlRootElement中的命名空间,但是当我尝试动态设置它(通过动态创建的变量)时,我收到一个错误:
The value for annotation attribute XmlRootElement.namespace must be a constant expression
我希望我的问题很清楚,我正在努力完成这项工作。 或者是否有任何其他解决方案可以绕过命名空间检查?(我不想关闭命名空间感知)