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

jaxb,子元素的单独名称空间

赵镜
2023-03-14

我正在尝试使用jaxb创建XML,如下所示,其中子元素有单独的命名空间。

 <soap:Envelope xmlns:soap="http://demo.org/soap/envelope/"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <soap:Header>
           <element1 xmlns="http://childnamespacehere">
          <att1>test</att1>
          <att2>test</att2>
          </element1>       
     </soap:Header>
     <soap:Body>
         <element2 xmlns="http://childnamespacehere">
            <att1>test</att1>
            <att2>test</att2>
        </element2 >
    </soap:Body>
</soap:Envelope>

我的班级

  @XmlRootElement(name = "soap:Envelope", namespace = "http://schemas.xmlsoap.org/soap/envelope/")
  public class Envelope     

    private Element1 element1;   

    private Element2  element2;

    @XmlElementWrapper(name = "soap:Header")
    @XmlElement(name = "Element1", namespace = "http://childelementnamespace/")
    public void setElement1(Element1 element){ }

    @XmlElementWrapper(name = "soap:Body")
    @XmlElement(name = "Element2" , namespace = "http://childelementnamespace/")
    public void setElement2(Element2 element){ }

但我正在像下面这样生成xml,其中子模式位于根级别。

 <soap:Envelope xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://childelementnamespace/"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <soap:Header>
            <ns2:Element1>
                <att1>value</att1>
                <att2>value</att2>
            </ns2:Element1>
        </soap:Header>
        <soap:Body>
            <ns2:Element2>
                 <att1>value</att1>
                <att2>value</att2>
            </ns2:Element2>
        </soap:Body>
    </soap:Envelope>

我在package-info.java定义了@xmlschema

 @XmlSchema(namespace = "http://schemas.xmlsoap.org/soap/envelope/",
    xmlns = { @javax.xml.bind.annotation.XmlNs(prefix = "Element1", namespaceURI = "http://childelementnamespace"),
            @javax.xml.bind.annotation.XmlNs(prefix = "Element2", namespaceURI = "http://childelementnamespace") },
            elementFormDefault = XmlNsForm.QUALIFIED)

    package com.model;

    import javax.xml.bind.annotation.XmlNsForm;
    import javax.xml.bind.annotation.XmlSchema;

当我生成xml时,子元素的名称空间没有被生成,我只得到根元素的命名空间。

共有3个答案

艾正浩
2023-03-14

这是一个临时的解决方案。当您想对xml文档进行解组时,这会引发重大问题。但是您也可以对马歇尔和未马歇尔进程使用不同的包。

王刚毅
2023-03-14

在你说正在生成的是有< code > xmlns:NS2 = " http://childelementnamespace/" 的地方,这是声明命名空间并以这种方式使用< code >

因此,您期望的和您得到的是完全相同的,只是在不同的地方声明,jaxB方法更正确,因为它不会多次声明相同的命名空间。

袁元明
2023-03-14

我已经通过向对象(子节点)Element1和Element2添加“xmlns”属性解决了这个问题。

  class Elemenet1

  @XmlAttribute(name="xmlns")
  String xmlns = "http://childnamespacehere";

  public void setXmlns(String namespace){};

  public String getXmlns(){};

输出

<soap:Envelope xmlns:soap="http://demo.org/soap/envelope/"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <soap:Header>
           <element1 xmlns="http://childnamespacehere">
          <att1>test</att1>
          <att2>test</att2>
          </element1>       
     </soap:Header>
     <soap:Body>
         <element2 xmlns="http://childnamespacehere">
            <att1>test</att1>
            <att2>test</att2>
        </element2 >
    </soap:Body>
</soap:Envelope>
 类似资料:
  • 是否有一种使用JAXB从非根元素以编程方式获取名称空间的方法? 我可以在根元素上使用以下内容(其中DetailedReport是根元素对象): 但是,如果我尝试使用来自同一个包的类型,但不是根元素,qname为null。 根据JAXBIntrospector的javadocs: 参数对象是以下情况的JAXB元素: 它是javax.xml.bind.JAXBElement的实例,object的类用@

  • 我正在写一个实用程序之间的集成内部系统和第三方产品。我试图生成一个可以由第三方产品加载的xml文件,但我很难按照他们的要求生成xml。我已经创建了一个简化的版本,只是为了测试。 预期产出应如下: 我的代码如下: 主要: 课程类别:

  • 仅当我从 XML 文件内的所有元素中删除“bpmn:”时,此代码才有效,否则它会引发以下异常: javax.xml.bind.UnmarshalException:意外元素(URI:"http://www.omg.org/spec/BPMN/20100524/MODEL",local:"定义") 我试图在不修改XML文件的情况下使其工作。任何帮助将不胜感激。提前致谢 :)

  • 我有几个关于JAXB编组的简单问题。我正在尝试封送包含以下字段的类: 只需使用以下序列化代码: 我得到的输出是: 现在,我面临的问题如下: > 我想要名称空间xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“出现在根元素中,即TokenRestrictionTemplate中,而不是单个子元素中。如何实现这一点? 我有一些元素,例如带有@Xm

  • 问题内容: 我有一个无法控制其生成方式的XML。我想通过将其分解为我手工编写的类来创建一个对象。 其结构的一个片段如下所示: 我该如何处理这种情况?当然,元素数是可变的。 问题答案: 如果使用以下对象模型,则每个未映射的key_#元素都将保留为org.w3c.dom.Element的实例: 如果任何元素对应于使用@XmlRootElement批注映射的类,则可以使用@XmlAnyElement(l

  • 我正在使用JAXB生成用于编组/解组XML的类。问题是父类的命名空间仅适用于XML中的父元素,而不适用于JAXB注释类中使用的子类。 我不知道我犯了什么错误。下面是我的xsd和xml以及类。 XSD: 项目Responses.xsd JAXB类 项目响应.java 项目响应.java Money.java XML输出: 包信息。java有以下条目 货币类别不在同一个包中。如何将其包含在 Jaxb