使用xstream将部分XML解组为字符串

使用xstream将部分XML解组为字符串,xml,marshalling,xstream,unmarshalling,Xml,Marshalling,Xstream,Unmarshalling,我正在使用xstream封送/解封xml。我有以下xml片段,我希望将节点“rawText”内容作为字符串存储在Form.javabean上 <FormData> <form id="1"> <rawText> <h1>All form submitted data goes here</h1>. <clob> This can contain more 'xml' like data with more nodes

我正在使用xstream封送/解封xml。我有以下xml片段,我希望将节点“rawText”内容作为字符串存储在Form.javabean上

<FormData>

<form id="1">

<rawText>

<h1>All form submitted data goes here</h1>. 
<clob> This can contain more 'xml' like data with more nodes </clob>

</rawText>

</form>

</FormData>
所以在上面的示例中,我希望将以下内容填充到表单bean的rawText字段中。我如何做到这一点

<h1>All form submitted data goes here</h1>. 
<clob> This can contain more 'xml' like data with more nodes </clob>
所有表单提交的数据都在这里。
这可以包含更多具有更多节点的类似“xml”的数据

据我所知,您应该建立一个自定义转换器,并处理reader.getValue()来连接文本,因为它不会返回您想要的全部文本。 请检查以下最常用的代码

转换器:

公共类FormConverter实现转换器{
@抑制警告(“原始类型”)
公共布尔canConvert(类clazz){
返回表单.class.isAssignableFrom(clazz);
}
公共无效封送处理(对象值、HierarchycalStreamWriter编写器、,
编组(上下文){
抛出新的UnsupportedOperationException(“反过来做!;)”;
}
公共对象解组(HierarchycalStreamReader,
解组(上下文){
最终形式f=新形式();
f、 setId(Integer.parseInt(reader.getAttribute(“id”));
reader.moveDown();
if(!“rawText”.equals(reader.getNodeName())){
抛出新的ConversionException(“预期为rawText,但为”
+reader.getNodeName());
}
最终StringBuilder文本=新StringBuilder();
while(reader.hasMoreChildren()){
reader.moveDown();
构建递归消息(读卡器、文本);
reader.moveUp();
}
f、 setRawText(text.toString());
返回f;
}
私有void buildRecursiveMessage(最终层次结构StreamReader读取器,
最终结果(b){
//构建开始标记
最后一个字符串nodeName=reader.getNodeName();
某人加上(“:“/>”);
if(包含Schildren){
while(reader.hasMoreChildren()){
reader.moveDown();
构建递归消息(读者,sb);
reader.moveUp();
}
}else if(包含值){
sb.append(reader.getValue());
}
//生成结束标记
如果(!空){
某人加上(“”);
}
}
}
表格类别:

@XStreamConverter(value=FormConverter.class)
公开课表格{
私有int-id;
私有字符串文本;
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
公共字符串getRawText(){
返回原始文本;
}
公共void setRawText(字符串rawText){
this.rawText=rawText;
}
}
只需管理根节点:

公共类FormData{
私人形式;
公共表单getForm(){
申报表;
}
公共作废表格(表格){
this.form=形式;
}
}
要测试:

publicstaticvoidmain(字符串[]args){
XStream XStream=newxstream(new statxdriver());
registerConverter(新FormConverter());
别名(“FormData”,FormData.class);
FormData f=(FormData)xstream.fromXML(文本);
System.out.println(f.getForm().getRawText());
}
输出:

所有表单提交的数据都在这里,这可以包含更多节点的类似“xml”的数据

再见

据我所知,您应该建立一个自定义转换器,并处理reader.getValue()来连接文本,因为它不会返回您想要的全部文本。 请检查以下最常用的代码

转换器:

公共类FormConverter实现转换器{
@抑制警告(“原始类型”)
公共布尔canConvert(类clazz){
返回表单.class.isAssignableFrom(clazz);
}
公共无效封送处理(对象值、HierarchycalStreamWriter编写器、,
编组(上下文){
抛出新的UnsupportedOperationException(“反过来做!;)”;
}
公共对象解组(HierarchycalStreamReader,
解组(上下文){
最终形式f=新形式();
f、 setId(Integer.parseInt(reader.getAttribute(“id”));
reader.moveDown();
if(!“rawText”.equals(reader.getNodeName())){
抛出新的ConversionException(“预期为rawText,但为”
+reader.getNodeName());
}
最终StringBuilder文本=新StringBuilder();
while(reader.hasMoreChildren()){
reader.moveDown();
构建递归消息(读卡器、文本);
reader.moveUp();
}
f、 setRawText(text.toString());
返回f;
}
私有void buildRecursiveMessage(最终层次结构StreamReader读取器,
最终结果(b){
//构建开始标记
最后一个字符串nodeName=reader.getNodeName();
某人加上(“:“/>”);
if(包含Schildren){
while(reader.hasMoreChildren()){
reader.moveDown();
构建递归消息(读者,sb);
reader.moveUp();
}
}else if(包含值){
sb.append(reader.getValue());
}
//生成结束标记
如果(!空){
某人加上(“”);
}
}
}
表格类别:

@XStreamConverter(value=FormConverter.class)
公开课表格{
私有int-id;
私有字符串文本;
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
公共字符串getRawText(){
返回原始文本;
}
公共void setRawText(字符串rawText){
this.rawText=rawText;
}
}
只需管理根节点:

公共类FormData{
私人形式;
公共表格ge
<h1>All form submitted data goes here</h1>. 
<clob> This can contain more 'xml' like data with more nodes </clob>