我使用SimpleXML来解析通信协议中使用的小型XML文件.这一切都很好,但现在我正在实现协议的一部分,其中包括一种自由格式的XML.
例如,像这样的XML:
<telegram> <config> <foo>yes</foo> <bar>no</bar> </config></telegram>
foo和bar将来可能会发生变化,或者可能会添加一个元素baz,而无需触及解析代码.我想使用类似的结构在Java中访问这些元素
tree.getConfig().get("bar"); // returns "no"
我可以使用SimpleXML来解析它吗?我查看了文档,但找不到我需要的东西.
解决方法:
Can I use SimpleXML to parse that?
不是开箱即用 – 但写一个Converter就可以了.
@Root(name = "telegram")@Convert(Telegram.TelegramConverter.class) // Requires AnnotationStrategypublic class Telegram{ private Map<String, String> config; public String get(String name) { return config.get(name); } public Map<String, String> getConfig() { return config; } // ... @OverrIDe public String toString() { return "Telegram{" + "config=" + config + '}'; } static class TelegramConverter implements Converter<Telegram> { @OverrIDe public Telegram read(inputNode node) throws Exception { Telegram t = new Telegram(); final inputNode config = node.getNext("config"); t.config = new HashMap<>(); // Iterate over config's child nodes and put them into the map inputNode cfg = config.getNext(); while( cfg != null ) { t.config.put(cfg.getname(), cfg.getValue()); cfg = config.getNext(); } return t; } @OverrIDe public voID write(OutputNode node, Telegram value) throws Exception { // Implement if you need serialization too throw new UnsupportedOperationException("Not supported yet."); } }}
用法:
final String xml = "<telegram>\n" + " <config>\n" + " <foo>yes</foo>\n" + " <bar>no</bar>\n" + " <baz>maybe</baz>\n" // Some "future element" + " </config>\n" + "</telegram>";/* * The AnnotationStrategy is set here since it's * necessary for the @Convert annotation */Serializer ser = new Persister(new AnnotationStrategy());Telegram t = ser.read(Telegram.class, xml);System.out.println(t);
结果:
Telegram{config={bar=no, foo=yes, baz=maybe}}
总结 以上是内存溢出为你收集整理的java – 我可以使用SimpleXML来解析结构未知的XML吗?全部内容,希望文章能够帮你解决java – 我可以使用SimpleXML来解析结构未知的XML吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)