gpt4 book ai didi

java - JAXB 编码 XMPP 节

转载 作者:搜寻专家 更新时间:2023-11-01 01:57:20 31 4
gpt4 key购买 nike

我正在尝试使用以下代码片段编码消息:

        JAXBContext jContext = JAXBContext.newInstance(Iq.class);
Marshaller m = newJAXBContext.createMarshaller();
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

Bind bind = new Bind();
bind.setResource("resource");
Iq iq = new Iq();
iq.setId(iqId);
iq.setType("set");
iq.getAnies().add(bind);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
m.marshal(iq, baos);

这里,Iq 和 Bind 是由相关的 xmpp 模式形成的对象。我的问题是,对于 jaxb 2.0 及更高版本,所有 namespace 都在根元素中声明:

<iq from='juliet@example.com/balcony'
id='rg1'
type='get' xmlns='jabber:client' xmlns:ns1='urn:ietf:params:xml:ns:xmpp-bind'>
<ns1:bind>
<ns1:resource>resource</ns1:resource>
</ns1:bind>
</iq>

但是,这里需要的是命名空间应该占据适当的位置:

<iq from='juliet@example.com/balcony'
id="rg1"
type="get" xmlns="jabber:client">
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
<resource>resource</resource>
</bind>
</iq>

有没有办法通过 JAXB 2.0 或更高版本编码 xmpp 节,就像您在第二个 xml 节中看到的那样?

长话短说,我这里有两个问题:1. 在适当的位置声明 namespace 。2. 删除我理解的命名空间前缀可以使用 NamespacePrefixMapper 删除吗?虽然不确定,但最好举个例子。

最佳答案

下面的怎么样?

创建一个自定义 XMLStreamWriter,它将所有命名空间声明视为默认命名空间,然后编码到它:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
XMLOutputFactory xof = XMLOutputFactory.newFactory();
XMLStreamWriter xsw = xof.createXMLStreamWriter(System.out);
xsw = new MyXMLStreamWriter(xsw);
m.marshal(iq, xsw);
xsw.close();

MyXMLStreamWriter

import java.util.Iterator;

import javax.xml.namespace.NamespaceContext;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

public class MyXMLStreamWriter implements XMLStreamWriter {

private XMLStreamWriter xsw;
private MyNamespaceContext nc = new MyNamespaceContext();

public MyXMLStreamWriter(XMLStreamWriter xsw) throws Exception {
this.xsw = xsw;
xsw.setNamespaceContext(nc);
}

public void close() throws XMLStreamException {
xsw.close();
}

public void flush() throws XMLStreamException {
xsw.flush();
}

public NamespaceContext getNamespaceContext() {
return xsw.getNamespaceContext();
}

public String getPrefix(String arg0) throws XMLStreamException {
return xsw.getPrefix(arg0);
}

public Object getProperty(String arg0) throws IllegalArgumentException {
return xsw.getProperty(arg0);
}

public void setDefaultNamespace(String arg0) throws XMLStreamException {
xsw.setDefaultNamespace(arg0);
}

public void setNamespaceContext(NamespaceContext arg0) throws XMLStreamException {
}

public void setPrefix(String arg0, String arg1) throws XMLStreamException {
xsw.setPrefix(arg0, arg1);
}

public void writeAttribute(String arg0, String arg1) throws XMLStreamException {
xsw.writeAttribute(arg0, arg1);
}

public void writeAttribute(String arg0, String arg1, String arg2) throws XMLStreamException {
xsw.writeAttribute(arg0, arg1, arg2);
}

public void writeAttribute(String arg0, String arg1, String arg2, String arg3) throws XMLStreamException {
xsw.writeAttribute(arg0, arg1, arg2, arg3);
}

public void writeCData(String arg0) throws XMLStreamException {
xsw.writeCData(arg0);
}

public void writeCharacters(String arg0) throws XMLStreamException {
xsw.writeCharacters(arg0);
}

public void writeCharacters(char[] arg0, int arg1, int arg2) throws XMLStreamException {
xsw.writeCharacters(arg0, arg1, arg2);
}

public void writeComment(String arg0) throws XMLStreamException {
xsw.writeComment(arg0);
}

public void writeDTD(String arg0) throws XMLStreamException {
xsw.writeDTD(arg0);
}

public void writeDefaultNamespace(String arg0) throws XMLStreamException {
xsw.writeDefaultNamespace(arg0);
}

public void writeEmptyElement(String arg0) throws XMLStreamException {
xsw.writeEmptyElement(arg0);
}

public void writeEmptyElement(String arg0, String arg1) throws XMLStreamException {
xsw.writeEmptyElement(arg0, arg1);
}

public void writeEmptyElement(String arg0, String arg1, String arg2) throws XMLStreamException {
xsw.writeEmptyElement(arg0, arg1, arg2);
}

public void writeEndDocument() throws XMLStreamException {
xsw.writeEndDocument();
}

public void writeEndElement() throws XMLStreamException {
xsw.writeEndElement();
}

public void writeEntityRef(String arg0) throws XMLStreamException {
xsw.writeEntityRef(arg0);
}

public void writeNamespace(String arg0, String arg1) throws XMLStreamException {
}

public void writeProcessingInstruction(String arg0) throws XMLStreamException {
xsw.writeProcessingInstruction(arg0);
}

public void writeProcessingInstruction(String arg0, String arg1) throws XMLStreamException {
xsw.writeProcessingInstruction(arg0, arg1);
}

public void writeStartDocument() throws XMLStreamException {
xsw.writeStartDocument();
}

public void writeStartDocument(String arg0) throws XMLStreamException {
xsw.writeStartDocument(arg0);
}

public void writeStartDocument(String arg0, String arg1) throws XMLStreamException {
xsw.writeStartDocument(arg0, arg1);
}

public void writeStartElement(String arg0) throws XMLStreamException {
xsw.writeStartElement(arg0);
}

public void writeStartElement(String arg0, String arg1) throws XMLStreamException {
xsw.writeStartElement(arg0, arg1);
}

public void writeStartElement(String arg0, String arg1, String arg2) throws XMLStreamException {
xsw.writeStartElement("", arg1, arg2);
if(null != arg2 || arg2.length() > 0) {
String currentDefaultNS = nc.getNamespaceURI("");
if(!arg2.equals(currentDefaultNS)) {
writeDefaultNamespace(arg2);
nc.setDefaultNS(arg2);
}
}
}

private static class MyNamespaceContext implements NamespaceContext {

private String defaultNS = "";

public void setDefaultNS(String ns) {
defaultNS = ns;
}

public String getNamespaceURI(String arg0) {
if("".equals(arg0)) {
return defaultNS;
}
return null;
}

public String getPrefix(String arg0) {
return "";
}

public Iterator getPrefixes(String arg0) {
return null;
}

}
}

关于java - JAXB 编码 XMPP 节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5720501/

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