java下处理一个xml文档,常常使用DOM(Document Object Model,SAX(Simple API for XML)什么的,但是,当文档很复杂的时候,我们其实可以使用一些偷懒的方法的,JAXB是我最习惯的偷懒大法.当文档大小适中(100MB下都是小文件,嗯.),直接把这个文档丢jaxb,然后从jaxb中寻找需要的信息.实在是一个好办法. 但是,有时候,我们会遇到一些奇怪的格式. 比如下面这么段XML.
<xxx> here is <italic>a</italic> sample of <bold>XmlMixed</bold> type. </xxx>
那么,它的 xsd 可能会是像这样的:
<complexType> <complexContent> <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> <choice maxOccurs="unbounded" minOccurs="0"> <element ref="{http://xxx/schema}italic"/> <element ref="{http://xxx/schema}bold"/> </choice> </restriction> </complexContent> </complexType>
而这段xsd通过xjc可能会生成如下的一些代码:
@XmlElementRefs({ @XmlElementRef(name = "bold", namespace = "http://xxx/schema", type = JAXBElement.class, required = false), @XmlElementRef(name = "italic", namespace = "http://xxx/schema", type = JAXBElement.class, required = false) }) @XmlMixed protected List<Object> content;
然后在需求的需要下,我们必须解析前面那个前面的那个"here is
若哪位有更多详细的信息,也先多谢指教.
解决
以前文的例子为例,我们可以得到一个 List<object> content, 这个 content 中包含3种类型的数据,1是普通的String类型,2是名叫bold的,JAXBElement类型,3是名叫italic的JAXBElement类型.
在类型上,其实就只有两种数据: 1. String , 2. JAXBElement
那么,我们可以使用类似于这样的一个方法来搞定.
public static String mixContentParse(List<Object> content){ String value = ""; for(Object cc: content){ if(cc.getClass().equals(JAXBElement.class)){ // italic or bold value += ((JAXBElement)cc).getValue(); }else if(cc.getClass().equals(String.class)){ // general String type value += ((String)cc); }else { System.out.println("There may sth wrong ?"); } } return value; }
这个方法就是获得
刚才师兄吐槽了下我的写法,然后给了个比较优美的写法
public static String mixContentParse(List<Object> content){ String value = ""; for(Object cc: content){ if(JAXBElement.class.isInstance(cc)){ // italic or bold value += ((JAXBElement<?>)cc).getValue(); }else if(String.class.isInstance(cc)){ // general String type value += (String)cc; }else{ System.out.println("there may sth wrong?"); } } return value; }
7 Comments
Leniy · August 9, 2013 at 20:59
我不喜欢java的地方就在于,什么都JAXBElement.class.isInstance这样的好长。我喜欢代码短的,即使没有语义型,如a[i]->p
yu · August 9, 2013 at 21:50
表示对代码风格不发表看法.代码设计者,教程是什么风格,我也会尽可能是那种风格..
所以我的Java和C/C++简直不像是一个人写的
Leniy · August 11, 2013 at 16:33
偶的代码,除了语言要求的语法,别的几乎风格是一样的
92原创 · August 5, 2013 at 14:44
这代码我能看懂了,呵呵
yu · August 5, 2013 at 20:07
java的类,方法,变量什么大多会取一些很长的名字,所以一般代码本身都带有自解释功能.
从这个角度上说,java还是可以的
小怪兽 · July 15, 2013 at 09:42
来支持一个。。
yu · July 15, 2013 at 10:19
这个评论很正常啊,为毛被丢判定去了