5

これが私のコードです:

xsdファイル:

<complexType name="Player">
    <sequence>
        <element name="Login" type="string"></element>
        <element name="Passwd" type="string"></element>
    </sequence>
</complexType>

<element name="Player" type="tns:Player"></element>

Build.xml:

    <exec executable="${javahome}/bin/xjc"  >

        <arg value="-extension" />
        <arg value="-b" />
        <arg value="binding.xml" />
        <arg value="-d" />
        <arg value="${sources}" />
        <arg value="-p" />
        <arg value="metier" />
        <arg value="Player.xsd" />

    </exec>
</target>

binding.xml:

<jxb:bindings 
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jxb:extensionBindingPrefixes="xjc" elementFormDefault="qualified" attributeFormDefault="unqualified"
version="2.1">

<jxb:globalBindings>
    <xjc:simple />
    <xjc:serializable/>
</jxb:globalBindings>

そして最終的に:

JAXBContext context = JAXBContext.newInstance(Player.class,ObjectFactory.class); Unmarshaller decodeur = context.createUnmarshaller();

@XMLRootElementを持つために「xjc:simple」を追加しましたが、例外が発生しました: javax.xml.bind.UnmarshalException:予期しない要素 (uri:"http://www.example.org/Player"

@XmlRootElement(name = "Player", namespace = "http://www.example.org/Player" )を取得したため、正しく機能しませんでした。

代わりに: @XmlRootElement(name = "Player")

この「名前空間」を削除するにはどうすればよいですか?

ありがとう

4

2 に答える 2

7

XMLスキーマが、対応するXMLドキュメントが名前空間修飾されるべきであることを示している場合、JAXBは期待される名前空間修飾を持つJavaモデルを生成します。以下では、StAXパーサーを利用してJAXBをだまし、名前空間で修飾されたドキュメントを解析していると思わせる方法について説明します。

プレーヤー

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Player", namespace="http://www.example.org/Player")
public class Player {

    private String login;
    private String passwd;

    @XmlElement(name="Login", namespace="http://www.example.org/Player")
    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    @XmlElement(name="Passwd", namespace="http://www.example.org/Player")
    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

}

NamespaceDelegate

の実装を作成しますStreamReaderDelegate。このデリゲートは、すべての要素イベントの名前空間を報告します"http://www.example.org/Player"。注:このトリックは、すべての要素が同じ名前空間URIで修飾されていることを前提としています。

import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.util.StreamReaderDelegate;

public class NamespaceDelegate extends StreamReaderDelegate {

    private static String NAMESPACE = "http://www.example.org/Player";

    public NamespaceDelegate(XMLStreamReader xsr) {
        super(xsr);
    }

    @Override
    public String getNamespaceURI() {
        return NAMESPACE;
    }

}

デモ

import java.io.FileInputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.util.StreamReaderDelegate;

public class Demo {

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

        FileInputStream xmlStream = new FileInputStream("input.xml");
        XMLInputFactory xif = XMLInputFactory.newFactory();
        XMLStreamReader xsr = xif.createXMLStreamReader(xmlStream);
        StreamReaderDelegate srd = new NamespaceDelegate(xsr);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Player player = (Player) unmarshaller.unmarshal(srd);

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

}

input.xml

<?xml version="1.0" encoding="UTF-8"?>
<Player>
    <Login>FOO</Login>
    <Passwd>BAR</Passwd>
</Player>
于 2011-05-30T20:37:08.940 に答える
-2

「ObjectFactory.class」を削除するだけで機能します。新しいコード:

JAXBContext context = JAXBContext.newInstance(Player.class);
Unmarshaller decodeur = context.createUnmarshaller();
于 2011-06-02T21:40:15.710 に答える