我正在使用JAXB将我的数据序列化为XML.类代码很简单,如下所示.我想生成包含CDATA块的XML,用于某些Args的值.例如,当前代码生成此XML:
<command>
<args>
<arg name="test_id">1234</arg>
<arg name="source"><html>EMAIL</html></arg>
</args>
</command>
Run Code Online (Sandbox Code Playgroud)
我想在CDATA中包装"source"arg,使其如下所示:
<command>
<args>
<arg name="test_id">1234</arg>
<arg name="source"><[![CDATA[<html>EMAIL</html>]]></arg>
</args>
</command>
Run Code Online (Sandbox Code Playgroud)
我怎样才能在下面的代码中实现这一点?
@XmlRootElement(name="command")
public class Command {
@XmlElementWrapper(name="args")
protected List<Arg> arg;
}
@XmlRootElement(name="arg")
public class Arg {
@XmlAttribute
public String name;
@XmlValue
public String value;
public Arg() {};
static Arg make(final String name, final String value) {
Arg a = new Arg();
a.name=name; a.value=value;
return a; }
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用JAXB编组为XML的Object.一个元素包含一个包含引号(")的String.生成的XML具有""存在的位置.
即使这通常是首选,我需要我的输出匹配遗留系统.如何强制JAXB不转换HTML实体?
-
感谢您的答复.但是,我从未看到处理程序escape()被调用.你能看一看,看看我做错了什么吗?谢谢!
package org.dc.model;
import java.io.IOException;
import java.io.Writer;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.dc.generated.Shiporder;
import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;
public class PleaseWork {
public void prettyPlease() throws JAXBException {
Shiporder shipOrder = new Shiporder();
shipOrder.setOrderid("Order's ID");
shipOrder.setOrderperson("The woman said, \"How ya doin & stuff?\"");
JAXBContext context = JAXBContext.newInstance("org.dc.generated");
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(CharacterEscapeHandler.class.getName(),
new CharacterEscapeHandler() {
@Override
public void escape(char[] ch, int start, int length,
boolean isAttVal, Writer out) throws IOException {
out.write("Called …Run Code Online (Sandbox Code Playgroud) 我使用编码"UTF-8"将对象编组到XML文件.它成功生成文件.但是当我试图将其解组时,会出现错误:
在属性"{1}"的值中找到无效的XML字符(Unicode:0x {2}),元素为"0"
字符为0x1A或\ u001a,在UTF-8中有效,但在XML中是非法的.JAXB中的Marshaller允许将此字符写入XML文件,但Unmarshaller无法解析它.我试图使用另一种编码(UTF-16,ASCII等),但仍然是错误.
常见的解决方案是在XML解析之前删除/替换此无效字符.但是,如果我们需要这个角色,如何在解组之后获得原始角色?
在寻找此解决方案时,我想在解组之前用替换字符(例如dot =".")替换无效字符.
我创建了这个类:
public class InvalidXMLCharacterFilterReader extends FilterReader {
public static final char substitute = '.';
public InvalidXMLCharacterFilterReader(Reader in) {
super(in);
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
int read = super.read(cbuf, off, len);
if (read == -1)
return -1;
for (int readPos = off; readPos < off + read; readPos++) {
if(!isValid(cbuf[readPos])) {
cbuf[readPos] = substitute;
}
}
return readPos - off + 1;
}
public boolean …Run Code Online (Sandbox Code Playgroud) 我在UTF-8()里面有一个String控制二进制文件.JAXB愉快地编组包含此类字符的XML文档,但后来无法解组它:0"A\u0000B"
final JAXBContext jaxbContext = JAXBContext.newInstance(Root.class);
final Marshaller marshaller = jaxbContext.createMarshaller();
final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Root root = new Root();
root.value = "A\u0000B";
final ByteArrayOutputStream os = new ByteArrayOutputStream();
marshaller.marshal(root, os);
unmarshaller.unmarshal(new ByteArrayInputStream(os.toByteArray()));
Run Code Online (Sandbox Code Playgroud)
根类很简单:
@XmlRootElement
class Root { @XmlValue String value; }
Run Code Online (Sandbox Code Playgroud)
输出XML包含二进制0以及之间A和B(十六进制:41 00 42),其解组期间导致以下错误:
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 63;
An invalid XML character (Unicode: 0x0) was found in the element content of the document.
Run Code Online (Sandbox Code Playgroud)
有趣的是,使用原始DOM API( …