4

したがって、この xml にいくつかの名前空間があるとしましょう。

<Envelope xmlns:pdi="http://www.mypage.com/schemas/pdi" xmlns:ib="http://www.mypage.com/schemas/ib" xmlns="http://www.mypage.com/schemas/envelope">
  <Product>
    <pdi:number>123456</pdi:number>
  </Product>
  <Instance>
    <ib:serial>abcdefg</ib:serial>
  </Instance>
</Envelope>

そのためのクライアントを構築しようとしています。このように宣言された Envelope POJO があります

@XmlRootElement(name ="Envelope", namespace = "http://www.mypage.com/schemas/envelope")
public class Envelope

そして内部には、これらの属性があります

@XmlElement(name="Product", namespace = "http://www.mypage.com/schemas/pdi")
public Product getProduct(){...}

@XmlElement(name="Instance", namespace = "http://www.mypage.com/schemas/ib")
public Instance getInstance(){...}

また、製品 POJO は次のようになります。

@XmlRootElement(name="Product", namespace = "http://www.mypage.com/schemas/pdi")
public class Product

と属性

@XmlElement(name="pdi:number", namespace = "http://www.mypage.com/schemas/pdi")
public int getNumber(){...}

なぜか品番がわかりません。リクエストエラーが発生し続けます。名前空間を正しく処理していますか、それとも何か不足していますか?

4

2 に答える 2

7

このユースケースでは、パッケージレベルの@XmlSchemaアノテーションを利用して名前空間の修飾を指定することをお勧めします。

package-info(forum14651918 / package-info.java)

@XmlSchema(
    namespace="http://www.mypage.com/schemas/envelope", 
    elementFormDefault=XmlNsForm.QUALIFIED,
    xmlns={
            @XmlNs(namespaceURI = "http://www.mypage.com/schemas/envelope", prefix = ""),
            @XmlNs(namespaceURI = "http://www.mypage.com/schemas/ib", prefix = "ib"),
            @XmlNs(namespaceURI = "http://www.mypage.com/schemas/pdi", prefix = "pdi")
    }
)
@XmlAccessorType(XmlAccessType.FIELD)
package forum14651918;

import javax.xml.bind.annotation.*;

封筒(forum14651918 / Envelope.java)

アノテーションにnamespaceelementFormDefaultを指定したので、クラスに対応するすべての要素は名前空間で自動的に修飾されます。@XmlSchemaEnvelopehttp://www.mypage.com/schemas/envelope

package forum14651918;

import javax.xml.bind.annotation.*;

@XmlRootElement(name="Envelope")
public class Envelope {

    @XmlElement(name="Product")
    private Product product;

    @XmlElement(name="Instance")
    private Instance instance;

}

製品(forum14651918 / Product.java)

アノテーションProductを使用して、クラスの名前空間をオーバーライドできます。@XmlType

package forum14651918;

import javax.xml.bind.annotation.*;

@XmlType(namespace="http://www.mypage.com/schemas/pdi")
public class Product {

    private int number;

}

インスタンス(forum14651918 / Instance.java)

アノテーションInstanceを使用して、クラスの名前空間をオーバーライドできます。@XmlType

package forum14651918;

import javax.xml.bind.annotation.XmlType;

@XmlType(namespace="http://www.mypage.com/schemas/ib")
public class Instance {

    private String serial;

}

デモ(forum14651918 / Demo.java)

以下は、すべてが機能することを証明するために実行できるコードです。

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

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Envelope.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum14651918/input.xml");
        Envelope envelope = (Envelope) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(envelope, System.out);
    }

}

詳細については

于 2013-02-01T18:04:31.207 に答える
1

に置き換えname="pdi:number", namespace = "http://www.mypage.com/schemas/pdi"てみてくださいname="number", namespace = "http://www.mypage.com/schemas/pdi"。プレフィックスは必要ありません。

XMLをさらに見ると、両方の名前空間のようにProduct見えInstanceますhttp://www.mypage.com/schemas/envelope

クラス@XmlRootElementにアノテーションは必要ありません。Productこれはルート要素ではなく、ですでに構成されていますgetProduct()

OKであるはずの完全な構成は次のとおりです。

@XmlRootElement(name ="Envelope", namespace = "http://www.mypage.com/schemas/envelope")
public class Envelope {


   @XmlElement(name="Product", namespace = "http://www.mypage.com/schemas/envelope")
   public Product getProduct(){...}

   @XmlElement(name="Instance", namespace = "http://www.mypage.com/schemas/envelope")
   public Instance getInstance(){...}

}
public class Product {

    @XmlElement(name="number", namespace = "http://www.mypage.com/schemas/pdi")
    public int getNumber(){...}
}

public class Instance {

    @XmlElement(name="serial", namespace = "http://www.mypage.com/schemas/ib")
    public String getSerial(){...}
}
于 2013-02-01T17:41:46.650 に答える