/**
 * 
 */
package com.ecc.test1105;import java.io.File;
import java.io.IOException;
import java.io.StringReader;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;/**
 * @author Liu Shijie
 * 
 */
public class XmlParser {
/**
 * @param args
 */
public static void main(String[] args) {
try {
//Resource r = new ClassPathResource("MyXml.xml");//使用Spring类比较方便
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
//Document d = db.parse(r.getInputStream());
Document d = db.parse(new File("MyXml.xml"));
NodeList nl = d.getChildNodes();
// System.out.println(nl.getLength());
Node n = nl.item(0);
NodeList cnl = n.getChildNodes();
// System.out.println(cnl.getLength());
for (int i = 0; i < cnl.getLength(); i++) {
Node cn = cnl.item(i);
if (cn.getNodeType() == Node.ELEMENT_NODE) {
// System.out.println(cn.getNodeName());
if (cn.getNodeName().equals("Content")) {
String cnv = cn.getFirstChild().getNodeValue();
// System.out.println(cn.getFirstChild().getNodeValue());
Document cnd = db.parse(new InputSource(
new StringReader(cnv)));
NodeList cnnl = cnd.getChildNodes();
// System.out.println(cnnl.getLength());
Node cnn = cnnl.item(0);
NodeList cncnl = cnn.getChildNodes();
// System.out.println(cncnl.getLength());
for (int j = 0; j < cncnl.getLength(); j++) {
Node cncn = cncnl.item(j);
if (cncn.getNodeType() == Node.ELEMENT_NODE) {
// System.out.println(cncn.getNodeName());
if (cncn.getNodeName().equals("AccNbr")) {
System.out.println(cncn.getFirstChild()
.getNodeValue());
}
}
}
}
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}}

解决方案 »

  1.   

    嵌套的两个头部信息其实第一个才是这个xml的头部信息,第二个不是
    第二个必须放在<![CDATA[]]>标签中间,只是<Content>的值罢了
    但<Content>中不能直接放'<','>'等字符,因为Parser需要判断:这是XML tag的开始;还是“<”小于号,这会导致解析错误。为了解决这个问题,可以使用符号&lt;&amp;来代替。
    但是如果text中包含太多的特殊符号,代替符号便不是一个好的办法,因此XML提供了CDATA section。里面可以直接放xml,而不会被解析
      

  2.   

    如果想要解析<![CDATA[]]> 标签中的XML,可以把<![CDATA[]]> 标签中的内容取出来后,再次用DOM转换一次,然后再解析。
      

  3.   

    <?xml   version= '1.0 '   encoding= 'GB2312 '?>
    <?xml   version= '1.0 '   encoding= 'UTF-8 '?> 这样的头文件,一般都是处理编码规则的。如输入汉字,在页面可正确显示等。
      

  4.   

    我再补充一下:
    <?xml version="1.0" encoding="UTF-8"  standalone="yes"?>
    XML声明一般是XML文档的第一行
    XML声明由以下几个部分组成:
    version - -文档符合XML1.0规范,网上说现在只有1.0
    encoding - -文档字符编码,默认为"UTF-8" 当然可以用GB2312的形式。
    一般还有一个属性standalone - -文档定义是否在一个文件内
    standalone="yes"
    standalone="no"