以字符串和解析值的形式获取xml,而不是使用Xstream的Java类

以字符串和解析值的形式获取xml,而不是使用Xstream的Java类,java,xstream,Java,Xstream,你能帮忙吗 我已经在工作中使用了您的解决方案,但我只能获取Xml字符串。我需要获得xml字符串和其他解析值,如下所示 输入xml: <data> <EventHandler-In> <request<processType>ABC</processType></request> </EventHandler-In> <requestNo>A12345</requestNo> </data&

你能帮忙吗

我已经在工作中使用了您的解决方案,但我只能获取Xml字符串。我需要获得xml字符串和其他解析值,如下所示

输入xml:

<data>
<EventHandler-In>
<request<processType>ABC</processType></request>
</EventHandler-In>
<requestNo>A12345</requestNo>
</data>

0)
{
某人加上(“”);
对于(int i=0;i“:“/>”);
if(包含Schildren)
{
while(reader.hasMoreChildren())
{
reader.moveDown();
构建递归消息(读者,sb);
reader.moveUp();
}
}
else if(包含值)
{
sb.append(reader.getValue());
}
//生成结束标记
如果(!空)
{
某人加上(“”);
}
}
}
EventHandler_In = <EventHandler-In><request<processType>ABC</processType></request></EventHandler-In>

requestNo = "A12345"
@XStreamAlias("data")

@XStreamConverter(value = DataXmlStringConverter.class)

public class PendingCaseInput
{

    private String EventHandler_In;

    @XStreamAlias("requestNo")
    private String requestNo;  

    public String getRequestNo()
    {
        return requestNo;
    }

    public void setRequestNo(String requestNo)
    {
        this.requestNo = requestNo;
    }

    public PendingCaseInput()
    {}


    public String getEventHandler_In()
    {
        return EventHandler_In;
    }
    public void setEventHandler_In(String eventHandler_In)
    {
        EventHandler_In = eventHandler_In;
    }

    public static void main(String[] args)
    {
        final XStream xstream = new XStream(new DomDriver());
        xstream.processAnnotations(PendingCaseInput.class);

        final String xml = "<data><EventHandler-In>           <request<processType>ABC</processType></request></EventHandler-In><requestNo>A12345</requestNo></data>";  

        final PendingCaseInput parent = (PendingCaseInput) xstream.fromXML(xml);
        System.out.println(parent.getEventHandler_In());
        System.out.println(parent.getRequestNo());
    }
}


 public class DataXmlStringConverter implements Converter
 {

     @Override

     public boolean canConvert(@SuppressWarnings("rawtypes") final Class type)
     {
         return PendingCaseInput.class.isAssignableFrom(type);
     }

@Override
public void marshal(Object source, HierarchicalStreamWriter writer,  MarshallingContext context)
{
     throw new UnsupportedOperationException("unmarshaling only");
}

@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context)
{
     reader.moveDown();

     if (!"EventHandler-In".equals(reader.getNodeName()))
     {
         throw new ConversionException("Expected message, but was " +  reader.getNodeName());
     }
     final StringBuilder message = new StringBuilder();

     buildRecursiveMessage(reader, message);
     while (reader.hasMoreChildren())
     {
         reader.moveDown();
         buildRecursiveMessage(reader, message);
         reader.moveUp();
     }
     reader.moveUp();

     final PendingCaseInput inputData = new PendingCaseInput();
     inputData.setEventHandler_In(message.toString());
     return inputData;

}

 private void buildRecursiveMessage(final HierarchicalStreamReader      reader, final StringBuilder sb)
 {
    // Build start-tag
    final String nodeName = reader.getNodeName();
    sb.append("<" + nodeName);

    // Build attributes
    final int numAttributes = reader.getAttributeCount();
    if (numAttributes > 0)
    {
        sb.append(" ");
        for (int i = 0; i < numAttributes; i++)
        {
             final String attributeName = reader.getAttributeName(i);
             final String attributeValue = reader.getAttribute(i);
             sb.append(attributeName + "=\"" + attributeValue + "\"");

             final boolean lastAttribute = (i == numAttributes - 1);
             if (!lastAttribute)
             {
                 sb.append(", ");
             }
         }
    }

    // Build children
    final boolean containsChildren = reader.hasMoreChildren();
    final boolean containsValue = !reader.getValue().isEmpty();
    final boolean empty = !containsChildren && !containsValue;

    sb.append(!empty ? ">" : " />");

    if (containsChildren)
    {
        while (reader.hasMoreChildren())
        {
            reader.moveDown();
            buildRecursiveMessage(reader, sb);
            reader.moveUp();
        }
    }
    else if (containsValue)
    {
        sb.append(reader.getValue());
    }

    // Build end-tag
    if (!empty)
    {
         sb.append("</" + nodeName + ">");
    }
    }
}