相关疑难解决方法(0)

如何使用JAXB生成CDATA块?

我正在使用JAXB将我的数据序列化为XML.类代码很简单,如下所示.我想生成包含CDATA块的XML,用于某些Args的值.例如,当前代码生成此XML:

<command>
   <args>
      <arg name="test_id">1234</arg>
      <arg name="source">&lt;html>EMAIL&lt;/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)

java xml jaxb cdata

40
推荐指数
7
解决办法
7万
查看次数

我可以强制JAXB不转换成"进入",例如,当编组到XML时?

我有一个使用JAXB编组为XML的Object.一个元素包含一个包含引号(")的String.生成的XML具有&quot;"存在的位置.

即使这通常是首选,我需要我的输出匹配遗留系统.如何强制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)

java jaxb xml-serialization marshalling html-entities

25
推荐指数
2
解决办法
6万
查看次数

Unmarshall期间无效的XML字符

我使用编码"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)

java jaxb xml-serialization unmarshalling

10
推荐指数
1
解决办法
2万
查看次数

成功编组后无法取消编组\ u0000

我在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以及之间AB(十六进制: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( …

java xml unicode jaxb

9
推荐指数
1
解决办法
1605
查看次数