Java JAXB似乎正在重新编码新行字符

Java JAXB似乎正在重新编码新行字符,java,encoding,jaxb,Java,Encoding,Jaxb,我有以下代码 public static final String NEWLINE = String.format("%n"); ... StringBuilder b = new StringBuilder(); ... b.append(NEWLINE); return b.toString(); 然而,当我在SOAPUI中运行这个程序并查看原始数据时,它看起来像是在再次扩展它,新的行变成了 &#xD; 所以不是 <SOAPEnvelope>1,name,value

我有以下代码

public static final String NEWLINE = String.format("%n");
...
StringBuilder b = new StringBuilder();
...
b.append(NEWLINE);
return b.toString();
然而,当我在SOAPUI中运行这个程序并查看原始数据时,它看起来像是在再次扩展它,新的行变成了

&#xD;
所以不是

<SOAPEnvelope>1,name,value
             2,name,value<SOAPEnvelope>
1、名称、值
2、名称、值
它显示为

<SOAPEnvelope>1,name,value&#xD;
             2,name,value&#xD;<SOAPEnvelope>
1,名称、值和xD;
名称、值和xD;
因此,当我使用正则表达式查询替换为空字符串进行解析时,全文仍然存在

现在我对编码不太熟悉,但这是SOAP消息的有效负载。信封被剥离,并输出到CSV文件。当我在Notepad++中打开CSV时,新行字符似乎可以工作,但编码值仍然存在。有人知道我错过了什么吗

我尝试添加(sb=Stringbuilder)

sb.追加(“”);
但这似乎不起作用,JAXB似乎再次逃脱了角色

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns4:ReportResult xmlns:ns2="http://me.com/v1_9/service" xmlns:ns3="http://me.com/v1_9/service/objects" xmlns:ns4="http://me.com/v1_9/service/operations">&lt;![CDATA[000000,LK20130930120048,Compant,Data,20130930120048,,&#xD;
000001,user,Fname,Mname,Lname,12345 Address 1,Address 2222,setAddress3,setCity,OH,US,44332,,N,N,E,,,,?,,&#xD;
999999]]&gt;</ns4:ReportResult></soapenv:Body></soapenv:Envelope>
![CDATA[000000,LK20130930120048,公司,数据,20130930120048,和#xD;
000001,用户,Fname,Mname,Lname,12345地址1,地址2222,设置地址3,设置城市,俄亥俄州,美国,44332,N,N,E,和#xD;
999999]]

我也可以使用类似的东西,但我使用JAX-WS的默认封送拆收器。因此,我不确定该将其放置在何处。

尝试将特殊字符包装在
块中。它应该避免重新编码。

尝试将特殊字符包装在
块中。它应该避免重新编码。

JAXB(JSR-222)实现将执行以下操作:

  • \n
    将作为新行写入XML
  • \r
    将作为
    和#xD
演示代码 Foo

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

    public String slashN;
    public String slashR;
    public String slashRslashN;

}
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Foo foo = new Foo();
        foo.slashN = "Hello\nWorld";
        foo.slashR = "Hello\rWorld";
        foo.slashRslashN = "Hello\r\nWorld";

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}
演示

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

    public String slashN;
    public String slashR;
    public String slashRslashN;

}
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Foo foo = new Foo();
        foo.slashN = "Hello\nWorld";
        foo.slashR = "Hello\rWorld";
        foo.slashRslashN = "Hello\r\nWorld";

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}
输出


你好
世界
你好
;世界
你好
;
世界
JAXB(JSR-222)实现将执行以下操作:

  • \n
    将作为新行写入XML
  • \r
    将作为
    和#xD
演示代码 Foo

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

    public String slashN;
    public String slashR;
    public String slashRslashN;

}
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Foo foo = new Foo();
        foo.slashN = "Hello\nWorld";
        foo.slashR = "Hello\rWorld";
        foo.slashRslashN = "Hello\r\nWorld";

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}
演示

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

    public String slashN;
    public String slashR;
    public String slashRslashN;

}
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Foo foo = new Foo();
        foo.slashN = "Hello\nWorld";
        foo.slashR = "Hello\rWorld";
        foo.slashRslashN = "Hello\r\nWorld";

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}
输出


你好
世界
你好
;世界
你好
;
世界

您所说的“再次扩充”是什么意思?如果你能展示一些输入和实际输出,这将非常有帮助。这看起来像是一个XML编码的回车符,这在XML文档中并不特别令人惊讶。是的,我想这也是正在发生的事情,我只是不擅长编码。因此,一旦我使用它,我就使用perl将其解析为一个文件,它似乎维护了char(该值显示出来,而不仅仅是一个回车符)。让我知道什么其他信息可以让它更清楚。为什么你不能发布样本数据?它不一定是一个包含重要数据的真实文件——只有几行“foo”和“bar”类型的数据。我们没有正确地混淆数据是主要原因。但这正是我试图用这些SOAPEnvelope示例所做的。我会尽量把更多的东西放在一起,但是你有什么特别想要的吗?我会尽快整理出一个要点。仅仅因为你没有混淆你的真实数据肯定不会阻止你拿出样本数据。老实说,现在很难理解您正在做什么——例如,您的示例代码对SOAP没有任何作用。更多的描述和更多的代码将非常有用。明白你说的“再增加一次”是什么意思吗?如果你能展示一些输入和实际输出,这将非常有帮助。这看起来像是一个XML编码的回车符,这在XML文档中并不特别令人惊讶。是的,我想这也是正在发生的事情,我只是不擅长编码。因此,一旦我使用它,我就使用perl将其解析为一个文件,它似乎维护了char(该值显示出来,而不仅仅是一个回车符)。让我知道什么其他信息可以让它更清楚。为什么你不能发布样本数据?它不一定是一个包含重要数据的真实文件——只有几行“foo”和“bar”类型的数据。我们没有正确地混淆数据是主要原因。但这正是我试图用这些SOAPEnvelope示例所做的。我会尽量把更多的东西放在一起,但是你有什么特别想要的吗?我会尽快整理出一个要点。仅仅因为你没有混淆你的真实数据肯定不会阻止你拿出样本数据。老实说,现在很难理解您正在做什么——例如,您的示例代码对SOAP没有任何作用。更多的描述和更多的代码将非常有用。看,谢谢,顺便说一句,我想要你的JavaOne幻灯片,因为我生病了,错过了你的演示。无论如何,正如您所看到的,我使用的是泛型(%n),因此\r是从中产生的吗?是否需要使用\n而不是String.format(“%n”)?CSV传输到Windows后\n还会工作吗?基本上现在他们只是在剥离perl中的字符,所以我想避免这样做。谢谢伙计,顺便说一句,我想要你的JavaOne幻灯片,因为我生病了,错过了你的演示。无论如何,正如您所看到的,我使用的是泛型(%n),因此\r是从中产生的吗?是否需要使用\n而不是String.format(“%n”)?CSV传输到Windows后\n还会工作吗?基本上现在他们只是在剥离perl中的字符,所以我想避免这样做。