栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

获取XML作为字符串而不是使用xstream的类

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

获取XML作为字符串而不是使用xstream的类

idia将通过处理来建立消息的xml

HierarchicalStreamReader
。如果不幸地
<messsage>
调用失败,则不会返回此元素的全部内容。
reader.goDown()``reader.getValue()

模型

    @XStreamAlias("parent")    @XStreamConverter(value = ParentConverter.class)    public class Parent {        private final String message;        public Parent(final String message) { this.message = message; }        public String getMessage() { return message; }    }

转换器

    public class ParentConverter implements Converter {        @Override        public boolean canConvert(@SuppressWarnings("rawtypes") final Class type) { return Parent.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 (!"message".equals(reader.getNodeName())) {     throw new ConversionException("Expected message, but was "  + reader.getNodeName()); } final StringBuilder message = new StringBuilder(); while (reader.hasMoreChildren()) {     reader.moveDown();     buildRecursiveMessage(reader, message);     reader.moveUp(); } reader.moveUp(); final Parent parent = new Parent(message.toString()); return parent;        }        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 + ">"); }        }    }

这个测试

    public static void main(String[] args) {        final XStream xstream = new XStream();        xstream.processAnnotations(Parent.class);        // Deserialize        final String xml = "<parent><message><type>15</type></message></parent>";        final Parent parent = (Parent) xstream.fromXML(xml);        System.out.println(parent.getMessage());    }

打印出来

    <type>15</type>

但这不是所有相同的内容!例如,它会忽略空格,它们

<foo></foo>
会映射到空白,
<foo/>
而我并未测试XML实体,例如
&apos;
etc。

最好将您的消息包含在CDATA标签中?喜欢

    <parent>      <message>       <![CDATA[       <type>15</type>       ]]>      </message>    </parent>


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454983.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号