Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XStream:将部分XML保持为XML_Java_Xml_Xstream - Fatal编程技术网

Java XStream:将部分XML保持为XML

Java XStream:将部分XML保持为XML,java,xml,xstream,Java,Xml,Xstream,我有以下XML: <patient> <name>Mr. Sick</name> <report> <paragraph><bold>Conclusion</bold>text...</paragraph> </report> </patient> 生病先生 结论文本。。。 我想将其转换为类Patient的实例,如下所示: Clas

我有以下XML:

<patient>
    <name>Mr. Sick</name>
    <report>
        <paragraph><bold>Conclusion</bold>text...</paragraph>
    </report>
</patient>

生病先生
结论文本。。。
我想将其转换为类Patient的实例,如下所示:

Class Patient {
    String name = "Mr. Sick";
    String report = "<paragraph><bold>Conclusion</bold>text...</paragraph>";
}
分类患者{
String name=“生病先生”;
字符串报告=“结论文本…”;
}

是否可以使用XStream仅转换XML的一部分,并将报告字段保持为XML格式?如何做到这一点?

我对所问的问题没有答案,但我建议一个可能有帮助的替代方案

您可能应该转义
报告
字段的内容。这将帮助您避免无效的xml,这在解组时可能会有很大的问题

下面是一种简单的方法(使用apache的commons库):

分类患者{
String name=“生病先生”;
字符串报告=StringEscapeUtils.escapeHtml(
“结论文本…”);
//report=“paragraphboldConclusion/boldtext…/段落”
}

如前所述,我通过创建转换器实现解决了这个问题。我对这个问题的解决办法如下:

Patient.java

public class Patient {
    String name;
    Report report;
}
Report.java

public class Report {
    public String report;
}
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; 
    } 
}
公共类ReportConverter实现转换器{
@凌驾
公共布尔canConvert(类类){
System.out.println(“canConvert:+classs.getName());
返回classs.equals(Report.class);
} 
@凌驾
公共无效封送处理(对象值、HierarchycalStreamWriter编写器、,
编组(上下文){
//本例中未使用
} 
//递归遍历中的所有节点
字符串GetNodeEastText(HierarchycalStreamReader){
字符串结果;
result=”“+reader.getValue();
while(reader.hasMoreChildren()){
reader.moveDown();
结果+=GetNodeEasText(读卡器);
reader.moveUp();
结果+=reader.getValue();
}
结果+=”;
返回结果;
}
@凌驾
公共对象解组(HierarchycalStreamReader,
解组(上下文){
报告xReport=新报告();
xReport.report=reader.getValue();
while(reader.hasMoreChildren()){
reader.moveDown();
xReport.report+=getNodeEasText(读卡器);
reader.moveUp();
xReport.report+=reader.getValue();
}
返回报告;
} 
}
转换器与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);
XStream XStream=newxstream();
registerConverter(新的ReportConverter());
别名(“patient”,patient.class);
别名(“report”,report.class);
String xml=“生病先生”+
“此处的某些文本结论文本…”+
“你好,世界”;
Patient-Patient=(Patient)xStream.fromXML(xml);
System.out.println(“patient.name:+patient.name”);
System.out.println(“patient.report:+patient.report.report”);
输出

patient: Mr. Sick
patient.report: <paragraph>some text here<bold>Conclusion</bold>text...
    ...</paragraph><sdf>hello world</sdf>
患者:生病先生
病人报告:这里有一些文字结论文字。。。
……你好,世界

GetNodeEasText()的更好版本,包括每个节点的属性:


私有字符串GetNodeEastText(HierarchycalStreamReader){

StringBuilder str=new StringBuilder();
str.append(“”)
.append(reader.getValue());
while(reader.hasMoreChildren()){
reader.moveDown();
str.append(getnodestext(reader));
reader.moveUp();
str.append(reader.getValue());
}
str.append(“”);
return str.toString();
}


如果我从Patient类实例开始,然后创建XML,这将起作用。我需要另一种方式。我有一个满是有问题的XML消息的数据库。我喜欢将它们转换为一个java类,如我的示例中所示。是否愿意向我们展示在这种特殊情况下,您对代码有什么收获?您可以使用JAXB实现(Metro、EclipseLink MOXy、Apache JaxMe)和
@XmlAnyElement
注释来实现这一点:谢谢。虽然我没有使用这个解决方案,但它有助于找到答案。对@xmlanyement和XStream的搜索给了我足够的信息让我重新开始。我张贴了我对这个问题的答案。
patient: Mr. Sick
patient.report: <paragraph>some text here<bold>Conclusion</bold>text...
    ...</paragraph><sdf>hello world</sdf>
StringBuilder str = new StringBuilder();
str.append("<")
   .append(reader.getNodeName());

for (int i = 0; i < reader.getAttributeCount(); i++) {
  String name = reader.getAttributeName(i);
  String value = reader.getAttribute(i);
  str.append(" ")
     .append(name)
     .append("=\"")
     .append(value)
     .append("\"");
}
str.append(">")
   .append(reader.getValue());

while (reader.hasMoreChildren()) {
  reader.moveDown();
  str.append(getNodeAsText(reader));
  reader.moveUp();
  str.append(reader.getValue());
}
str.append("</")
   .append(reader.getNodeName())
   .append(">");

return str.toString();