我有许多Java类与JAXB结合使用以生成XML。 java类每年的变化很小,但输出的XML需要对其进行非常具体的年度更改,这样做有点难以捉摸。我试过使用DOM更新属性,但沿着树的更多节点保持以前的状态。我试着用反射来在编组之前直接更新注解,但它似乎没有达到预期的效果。我也尝试用本地类替换XMLRootElement对象(和XMLType,XMLElement),但似乎没有任何工作正常,因为某些信息似乎总是保留在某个地方,即使看起来我已更改成员/属性/等。在运行时动态设置XML URI - XSLT选项
我不打算每年复制所有java对象,以便我可以更改命名空间以符合要求。
现在我正处在我认为XSLT可能是最后一个选项的地步,但我几乎不知道它。是否有一种简单的方法来更新位于根元素上的5-8个名称空间URI?我不想更改前缀(它们已经使用前缀映射器设置),我只想将名称空间从“com.help.me.2014”更改为“com.help.me.2015”。
感谢 安迪
分辨率:
首先,我非常感谢的努力和响应。在我回来看他们之前,我没有尝试其中的任何一个,因为我想出了一个不同的解决方案。
任何未来的人都可以尝试下面列出的项目(作为XSLT解决方案),或者您可以尝试下面描述的内容。
我以两种不同的样式/格式生成XML,一种带有和没有SOAP包装。由于我在访问DOM/SOAP对象中的实际名称空间时遇到困难,并且无法在运行时更改注释,所以我最终捕获了输出流并操作了结果字符串。
SOAP:
ByteArrayOutputStream stream = new ByteArrayOutputStream(); soapMessage.writeTo(stream); String file = new String(stream.toByteArray);
...操作文件(现在是字符串),替换值等 - >实际传递进行依赖注入的转换器,然后通过发送响应到客户端。写
JAXB编组与SOAP非常相似,都将结果字符串发送到转换器,并将其作为StringBuilder操作,然后将其发送。
再次感谢您的建议。希望它能帮助未来的某个人,尽管这个要求有点不同。
安迪
这问题太广泛了,但是对于一个设计来说,类的变化很小,但每年都会改变5-8个名称空间。在你面临的任何其他挑战中,你可能会遭受糟糕设计决定的后果。 – kjhughes
这可能很简单,只需在根上重写URI即可。前缀只是URI处的指针。不需要额外的映射。 –
正如@kjhughes建议的那样,它看起来像在这里不恰当地使用命名空间。使用像_com.help.me_这样的固定名称空间和像'year ='2014''这样的属性似乎更合适。我相信这可以用XSLT来完成,但是操作这样的命名空间是非常棘手的,因为它们实际上并不是为这种目的而设计的。然而,我现在唯一能想到的唯一事情是在所有旧元素的新命名空间中创建生成的元素。尽管如此,这将改变前缀。 – Matthew