当前位置: 首页 > 知识库问答 >
问题:

JAXB:缺少命名空间

逑阳泽
2023-03-14

我试图从通过JAXB生成的类序列化XML。

班级:

package ws.avail;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "pos",
    "uniqueID",
    "availStatusMessages"
})
@XmlRootElement(name = "OTA_HotelAvailNotifRQ")
public class OTAHotelAvailNotifRQ {
 ...
}

文件“package-info.java”:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.opentravel.org/OTA/2003/05", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package ws.avail;

编组器(简化,无需错误处理):

context = JAXBContext.newInstance(rootElement.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(rootElement, stringWriter);
return stringWriter.toString();

此代码生成:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
<OTA_HotelAvailNotifRQ Version="1.000" Target="TEST">  
....

我期待这样的事情:

<?xml version="1.0" encoding="UTF-8"?>  
<OTA_HotelAvailNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.000" Target="TEST">  
....

我有一个类似的代码并且工作正常,但是我不明白为什么这个代码不显示命名空间。有线索吗?谢谢!

共有1个答案

鲁斯伯
2023-03-14

您的映射是正确的

我试用了你的模型,它对我有用:

演示

package ws.avail;

import java.io.StringWriter;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        OTAHotelAvailNotifRQ rootElement = new OTAHotelAvailNotifRQ();
        StringWriter stringWriter = new StringWriter();

        JAXBContext context = JAXBContext.newInstance(rootElement.getClass());
        Marshaller marshaller = context.createMarshaller();
        marshaller.marshal(rootElement, stringWriter);
        System.out.println(stringWriter.toString());
    }

}

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><OTA_HotelAvailNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"/>

溶液

通常,当出现此问题时,< code>package-info类没有编译或没有与应用程序打包在一起。

更多信息

    < Li > http://blog . bdoughan . com/2010/08/JAXB-namespaces . html
 类似资料:
  • 例如,一个XML属性值是,但名称空间前缀“repository”从未在数据集中定义。(不要紧,提供商的最佳实践建议定义它!) 所以当我去解封一个示例集时,具有指定前缀的QName属性(在我上面的示例中为“Repository”)是空的!所以看起来JAXB正在“抛出”那些具有未定义名称空间前缀的属性QName值。我很惊讶,它甚至没有保留当地的名字。 理想情况下,我希望保持该值原样,但看起来我无法在绑

  • 我必须解析一个XML,其中缺少xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"命名空间,所以xml看起来像这样: 但应该是这样的: type属性确保了正确的子类。 解析器是通过一个手写的xsd自动生成的$ 一个简单的解决方案是在输入XML上运行一个字符串替换(type=\\"到xsi: type=\"),但这很难看。有没有更好的解决办法?

  • 我有情况, 有一个sample.xsd(旧版本-没有命名空间)。为同一个XSD文件使用XJC生成JAXB类。我得到了一个使用JAXB类基于XSD解封XML数据文件的示例。sample.xsd文件已更改(新版本-添加的命名空间)。再次为新的XSD文件使用XJC生成JAXB类。该示例已更新,现在可以用于新的XSD文件 现在我有一个情况,我正在获取基于旧XSD的XML数据文件,我想使用更新的示例文件来解

  • 供应商提供的XML如下: 请注意,没有声明,供应商也没有提供模式。这不能更改,供应商将来会继续这样发布XML。 为了生成JAXB绑定,我创建了如下模式: 请注意,我已经声明了一个或多或少有意义的命名空间(“http://acme.com/schema”),以便它可以用于元素引用等。XJC 生成以下: 然后,我尝试解组XML文档: 我得到的例外是: 显然,这是因为XML元素属于一个空的名称空间,而J

  • 出现的错误是“架构无效或缺少命名空间”。我是新手,我不知道我现在做了什么。此错误不会在代码中显示任何错误的行或其他缺失的值。 当我在记事本中单击时:插头- 我有XSD文件: 我的xml文件如下:

  • 我有一个为安全令牌构建的XML。这些包含基于WS-Trust的名称空间,但是当我解组这个XML以创建< code > RequestSecurityTokenResponseCollection 对象时,它用< code>ns1 、< code>ns2 、< code>ns3等名称空间替换了这些名称空间。 是否有一种方法可以在不更改输入XML中的名称空间和名称空间前缀的情况下解组XML? 这是我一