<?xml version="1.0" encoding="UTF-8"?>
<!--Sort种类,Book名字,Author作者,Intro简介-->
<NovelInfo>
<Sort name="武侠">
<Book name=" 古侠今遇"/>
<Item>
<Author>醉人岁月</Author>
<Intro>
      与世隔绝三百多年的“碧湖山庄”四少侠出现在大都市中,
</Intro>
<Text>
       与世隔绝三百多年的“碧湖山庄”四少侠出现在大都市中,
         在记者精心安排下与现代人产生各种故事,既有古人的风
        采,又有现代人的韵味!情节离奇曲折,古代武功与现代
       科技揉和在一起,意味深长!与现代嵩山少林比试,更是
       经典中的经典!奇妙的结局,让您怵目惊心!
       第一章节 古侠惊现
       1.碧湖山庄 ..............,请下载后阅读
    </Text>
</Item>
<Book name="寒剑孤灯"/>
    <Item>
<Author>忧郁丁香</Author>
<Intro>
     桃花树下多冤魂!江山如画,美人如花,爱江山还是爱美人?
        “忠”字当先,但面对君王夺妻之恨,智勇双全的将军又当如
        何决择?硝烟里红颜身兼两国王后,因是一国王后开城出降,
        因是一国王后入城庆功。乱世出英才,谁能在滚滚烟尘中笑傲
        群雄?《寒剑孤灯》,演绎乱世英雄传奇。
</Intro>
</Item>
</Sort>
<Sort name="言情">
     <Book name="你在下了雨的晴天"/>
<Item>
<Author> 鱼日晨</Author>
<Intro>
                                不了门户的悬殊。她隐忍离开,四年后,带着巴黎首席设计师
                               头衔,荣光归来,却发现她那么笃定的男人即将跟别人订婚,
                                可无意得知里面另有隐情。她一再地遭人黑手,他一次次出手
                              相救;她丢了设计师的头衔,他脱离了豪门世家。但当两人即     
         </Intro>
</Item>
    <Book name="悠悠子衿"/>
<Item>
<Author> 幕小小</Author>
<Intro>
      谁说人死不能复生
    她莫悠悠不但活回来了,而且活得风生水起
   欧阳子衿看着这个酷似他已经死了三年的前妻的女人
</Intro>
</Item>
</Sort>
</NovelInfo>
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;public class ReadInfo {
public  static   void readInfo() {
   //创建解析器工厂对象
   DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
   try {
 //由解析器工厂对象创建解析器对象
DocumentBuilder db=dbf.newDocumentBuilder();
//由解析器对象指定xml文件进行解析,构建dom树,创建document对象;
Document doc=db.parse("C:/Users/zhangpeng/workspace/novelPlatformproject/src/com/bdqn/entity/Txt.xml");
//得到所有<sort>节点列表信息
NodeList sortList=doc.getElementsByTagName("Sort");
//循环Sort信息
for(int i=0;i<sortList.getLength();i++){
 Node sort=sortList.item(i);
    //获取第i个Sort元素的name属性的值并输出信息
   Element element=(Element) sort;
   String sortName=element.getAttribute("name");
   System.out.println(sortName);
   //得到Sort的子元素列表
 NodeList childList=  sort.getChildNodes();       
 for(int j=0;j<childList.getLength();j++){
     Element bookElement= (Element) childList.item(0);
String book=bookElement.getAttribute("name");
    System.out.println("类型:"+sortName+"\t 书名:"+book);

          }
         }                                                           
    } catch (Exception e) {
e.printStackTrace();
   }
}
public static void main(String[] args) {
readInfo();
}
}请问一下前辈们,我用在这个解析上面的xml文件时候老师出现这个错误,请指点!!!谢谢!   java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredTextImpl cannot be cast to org.w3c.dom.Element
at com.bdqn.tools.ReadInfo.readInfo(ReadInfo.java:33)
at com.bdqn.tools.ReadInfo.main(ReadInfo.java:48)   怎么会是 强制类型转化错误?

解决方案 »

  1.   

    可能是因为getElementsByTagName这个方法实际返回的是Element对象,所以前面可以强制转换成功而getChildNodes可能返回的只是Node对象,并不是Element对象,所以转换失败这只是我的猜测,其实我对这部分的api也不是很清楚,希望下面有高手回答
      

  2.   

    Element是Node的子接口,NodeList里面放的是Node,所以转化为Element是向下转型,最好加instanceof来判断,一般不建议向下转型,因为java只提供接口,不同的第三方jar包有不同的实现,有的时候能成功,有时候不一定了
      

  3.   

    你先获取下XML的root节点,然后在获取他下的子节点!
    你试下吧,我以前做的时候都是先获取root节点再获取他子节点、遍历的!
      

  4.   

    今天学了一遍xml文件的解析,发现原来getChildNodes这个函数还有可能返回空白的比方说:<font>
        <name>Helvetica</name>
        <size>36</size>
    </font>
    如果你使用getChildNodes会得到5个元素,分别是:
    Text: 空白
    Element: <name>
    Text: 空白
    Element: <size>
    Text: 空白所以你的程序也是这种情况,当你得到空白文本的时候,却想把它强制转化为Element对象,所以肯定会出问题你把出错的代码修改一下,在强制转化之前加一个instanceof判断,就行了下面是我在你出错的代码上修改的,可以参考一下//得到Sort的子元素列表
    NodeList childList= sort.getChildNodes();  
    for(int j=0;j<childList.getLength();j++){
    //Element bookElement= (Element) childList.item(0);
    Node child = childList.item(j);
    if (child instanceof Element)
    {
    Element bookElement = (Element) child;
    String book=bookElement.getAttribute("name");
    System.out.println("类型:"+sortName+"\t 书名:"+book);
    }
    }