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 a sample of XmlMixed type."这段信息. 而万能的google这次貌似不怎么灵了,很多人都提到了XmlMixed这个神秘生物,却没有找到谁来详细说说这个东西是怎么整的,或许大家都觉得这东西很简单,没啥好说的吧,连官方文档都没给个sample code...经过一些猜测后(好吧我各种菜的),终于解析出来了.以后自己可以复习下.若能帮助到别人,当然更好了. 若哪位有更多详细的信息,也先多谢指教.

解决

以前文的例子为例,我们可以得到一个List 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;
}

这个方法就是获得<xxx> 这个标签下的所有文本信息.然后返回为一个String.

写完后感觉的确很方便的,可惜没学过这个的结果就是,感觉常识都不知道..囧个

刚才师兄吐槽了下我的写法,然后给了个比较优美的写法

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;
}
来自的你,很高兴你能看到这儿。若本文对你有所用处,或者内容有什么不足之处,敬请毫不犹豫给个回复。谢谢!