【问题标题】:How can i remove namespace from the generated JAXB File?如何从生成的 JAXB 文件中删除命名空间?
【发布时间】:2011-05-28 14:03:07
【问题描述】:

这是我的代码:

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>

构建.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: unexpected element (uri: "http://www.example.org/Player"

它不能正常工作,因为我得到了这个:@XmlRootElement(name = "Player", namespace = "http://www.example.org/Player"强>)

而不仅仅是:@XmlRootElement(name = "Player")

如何删除这个“命名空间”?

谢谢

【问题讨论】:

  • 生成的 JAXB 代码根据您的 XML 模式匹配命名空间限定规则。您确定要从生成的对象模型中删除它吗?

标签: ant xsd jaxb xjc


【解决方案1】:

如果您的 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;
    }

}

命名空间委托

我们将创建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>

【讨论】:

    【解决方案2】:

    我只是删除了“ObjectFactory.class”,它就可以工作了。 新代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-04
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多