【问题标题】:jaxb, separate namespace for child elementjaxb,子元素的单独命名空间
【发布时间】:2013-05-14 20:53:09
【问题描述】:

我正在尝试使用如下格式的 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 时,没有生成子元素的命名空间,我只获取根元素的命名空间。

【问题讨论】:

  • 你的问题是什么?
  • 我需要在生成 xml 时获取子命名空间,但我不是
  • 你得到的 XML 是有效的,为什么你需要你的 NS 驻留在子元素中?
  • 我正在调用soap服务,它需要带有命名空间的子节点的xml。如果我没有子节点的命名空间,服务会抛出异常。
  • 但是您的子节点确实有一个命名空间,我看不到问题所在,它们的前缀是 ns2,它继承了顶部 ns2 命名空间中声明的命名空间。

标签: java jaxb2


【解决方案1】:

我已经通过将“xmlns”属性添加到对象(子节点)Element1 和 Element2 来解决。

  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,只需将 package-info.java 添加到您的域的包中,该包声明您想要的命名空间see here。 Jaxb 会自动为您放置 xmlns 属性,您只需从一处维护命名空间声明。
  • 嗨@pappu_kutty 我遇到了同样的问题,但是我无法使用新的“xmlns”属性更新对象。我想知道您是否有其他方法可以完成这项工作?
【解决方案2】:

在您所说的生成内容的顶部有xmlns:ns2="http://childelementnamespace/",这是声明命名空间并以这种方式使用&lt;ns2:Element2&gt;,这里使用ns2使用之前声明的namspace。

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

【讨论】:

  • 我希望子命名空间成为子节点的一部分,而不是根元素的一部分。基本上我正在尝试找出在子节点上获取子命名空间的解决方案,正如你所说,它对我不起作用。这是肥皂请求(请参阅我的问题的顶部),它需要与子节点相邻的命名空间并且不需要任何前缀,如果我在子节点处没有此命名空间,我会从服务中收到错误。跨度>
  • 它不适合“你想要的方式”,因为这种方式是错误的。如果您的服务因此而失败,我认为您的服务可能有问题。命名空间所在的位置不应在您的服务中失败。
【解决方案3】:

这是一个临时解决方案。当您想要解组 xml 文档时,这会引发重大问题。 但是您也可以对 marshall 和 unmarshall 过程使用不同的包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多