2

子要素が別の名前空間を持つ、以下の形式のような 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 を生成すると、子要素の名前空間が生成されず、ルート要素の名前空間のみが取得されます。

4

3 に答える 3

2

オブジェクト(子ノード)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>
于 2013-05-15T23:26:00.193 に答える
0

生成されているものが一番上にあると言う場所では、これは名前空間を宣言しており、 ns2 をxmlns:ns2="http://childelementnamespace/"使用してこの方法で使用されます。ここでは、以前に宣言された名前空間を使用します。<ns2:Element2>

したがって、期待しているものと取得しているものは、異なる場所で宣言されているだけでまったく同じです.jaxBメソッドは、同じ名前空間を複数回宣言していないため、より正確です.

于 2013-05-15T02:59:33.153 に答える
0

これは一時的な解決策です。これは、xml ドキュメントをアンマーシャリングする場合に大きな問題を引き起こします。ただし、マーシャルとアンマーシャルのプロセスに異なるパッケージを使用することもできます。

于 2015-07-09T13:51:48.143 に答える