gpt4 book ai didi

ant - 如何从生成的 JAXB 文件中删除命名空间?

转载 作者:行者123 更新时间:2023-12-04 17:04:16 25 4
gpt4 key购买 nike

这是我的代码:

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>

绑定(bind).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();

我添加“xjc:simple”以获得 @XMLRootElement ,但引发异常:javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.example.org/Player"

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

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

我怎样才能删除这个“命名空间”?

谢谢

最佳答案

如果您的 XML 模式指示相应的 XML 文档应该是 namespace 限定的,那么 JAXB 将生成一个具有预期 namespace 限定的 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;
}

}

命名空间委托(delegate)

我们将创建 StreamReaderDelegate 的实现.此委托(delegate)将报告所有元素事件的命名空间为 "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);
}

}

输入.xml
<?xml version="1.0" encoding="UTF-8"?>
<Player>
<Login>FOO</Login>
<Passwd>BAR</Passwd>
</Player>

关于ant - 如何从生成的 JAXB 文件中删除命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6162085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com