XStream:将XML的一部分保留为XML

boe*_*oes 5 java xml xstream

我有以下XML:

<patient>
    <name>Mr. Sick</name>
    <report>
        <paragraph><bold>Conclusion</bold>text...</paragraph>
    </report>
</patient>
Run Code Online (Sandbox Code Playgroud)

我想将此转换为类患者的实例,如下所示:

Class Patient {
    String name = "Mr. Sick";
    String report = "<paragraph><bold>Conclusion</bold>text...</paragraph>";
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用XStream仅转换部分XML并将报告字段保留为XML格式?怎么做到呢?

boe*_*oes 4

我通过创建转换器实现解决了这个问题,如此处所述。我的问题解决方案如下:

病人.java

public class Patient {
    String name;
    Report report;
}
Run Code Online (Sandbox Code Playgroud)

报告.java

public class Report {
    public String report;
}
Run Code Online (Sandbox Code Playgroud)

XStream 转换器的实现

public class ReportConverter implements Converter { 

    @Override 
    public boolean canConvert(Class classs) { 
        System.out.println("canConvert: " + classs.getName());
        return classs.equals(Report.class); 
    } 

    @Override 
    public void marshal(Object value, HierarchicalStreamWriter writer, 
            MarshallingContext context) {
        // not used in this example
    } 

    // goes recursive through all the nodes in <report>
    String getNodeAsText(HierarchicalStreamReader reader) {
        String result;
        result = "<" + reader.getNodeName() + ">" + reader.getValue();
        while (reader.hasMoreChildren() ) {
            reader.moveDown();
            result += getNodeAsText(reader);
            reader.moveUp();
            result += reader.getValue();
        }
        result += "</" + reader.getNodeName() + ">";
        return result;
    }

    @Override 
    public Object unmarshal(HierarchicalStreamReader reader, 
            UnmarshallingContext context) {
        Report xReport = new Report();
        xReport.report = reader.getValue();
        while (reader.hasMoreChildren() ) {
            reader.moveDown();
            xReport.report += getNodeAsText(reader);
            reader.moveUp();
            xReport.report += reader.getValue();
        }
        return xReport; 
    } 
}
Run Code Online (Sandbox Code Playgroud)

使用 XStream 转换器的示例

XStream xStream = new XStream();
xStream.registerConverter(new ReportConverter());
xStream.alias("patient", Patient.class);
xStream.alias("report", Report.class);
String xml = "<patient><name>Mr. Sick</name><report><paragraph>" +
        "some text here<bold>Conclusion</bold>text...</paragraph>" +
        "<sdf>hello world</sdf></report></patient>";
Patient patient = (Patient)xStream.fromXML(xml);
System.out.println("patient.name: " + patient.name);
System.out.println("patient.report: " + patient.report.report);
Run Code Online (Sandbox Code Playgroud)

输出

patient: Mr. Sick
patient.report: <paragraph>some text here<bold>Conclusion</bold>text...
    ...</paragraph><sdf>hello world</sdf>
Run Code Online (Sandbox Code Playgroud)