java - JAXB 解码 xml 而不使用 package-info.java

标签 java xml jaxb unmarshalling package-info

如果没有 package-info.java 文件,JAXB 解码器将引发异常。此代码是从另一种语言调用的,自定义类加载器无法正确加载包信息。

我已经手动将命名空间参数添加到所有 @XmlElement 注释中。

Xml 根元素具有多个 xmlns 属性。其中两个(xmlns 和 xmlns:c)具有相同的值(我无法更改来自外部服务的 xml)

但是:如果我从文档中删除 xmlns="urn:foo:bar"即使没有包信息,它也会起作用

问题:如何在没有包信息的情况下解码(我无法修改无法加载它的自定义类加载器)并且不从 xml 中删除 xmlns ? 我应该在代码中更改什么?

Java 1.6_45 vJAXB 2.1.10

XML 根元素示例:

<?xml-stylesheet type="text/xsl" href="file1.xslt">
<?xml-stylesheet type="text/xsl" href="file1.xslt"?>
<c:ClinicalDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="urn:foo:ba" xmlns:c="urn:foo:bar" xmlns:std="urn:foo:std"
 xsi:schemaLocation="urn:foo:bar file2.xsd">

代码:

String path = "D:\\data\\document.xml";

    try {
        JAXBContext jc = JAXBContext.newInstance(ObjectFactory.class);
        Unmarshaller u = jc.createUnmarshaller();
        Object root = u.unmarshal(new File(path)); //exception w/o package-info.java

        CDocument doc= (CDocument) JAXBIntrospector.getValue(root);
        System.out.println(doc);

包信息.java

@javax.xml.bind.annotation.XmlSchema(namespace = "urn:foo:bar", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
    xmlns={@XmlNs(namespaceURI = "urn:foo:bar", prefix = "")})
package test.model;

    import javax.xml.bind.annotation.XmlNs;

异常(exception):

javax.xml.bind.UnmarshalException: Unable to create an instance of my.package.here.model.ANY

任何想法都将不胜感激,我花了很多时间尝试,但仍然一无所获。

最佳答案

BUT: It works if I remove xmlns="urn:foo:bar" from document even without package-info

这意味着您尚未在需要的任何地方添加 namespace 参数。

在下面的 XML 文档中,如果没有使用 @XmlSchema 注释来映射命名空间限定,则需要在 Foo 类的 @XmlRootElement 注释上使用 namespace 参数,并在 bar 属性上使用 @XmlElement 注释。

<foo xmlns="http://www.example.com">
    <bar>Hello World</bar>
</foo>

关于java - JAXB 解码 xml 而不使用 package-info.java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23828191/

相关文章:

java - 为什么我的 String 对象没有被设置为索引 0 处的命令行参数?

xml - 正则表达式过滤器 log4j2

javascript - SAPUI5 - Model.Remove 生成​​两个请求

java - JAXB 或 StAX 消息限制

java - jaxb编码(marshal)复杂结构

java - 文件可用后立即运行 Spring Batch 作业

java - 有效使用给定整数数组的 K 互补对

java - 如何在java中获取任何文件的图标/图像?

java - 使用 java 进行 DOM 解析的规范化 - 它是如何工作的?

java - Jaxb Complex Marshal 元素