[转帖]Java之xml解析_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3514 | 回复: 0   主题: [转帖]Java之xml解析        下一篇 
wangxilu
注册用户
等级:少校
经验:850
发帖:73
精华:3
注册:2013-4-10
状态:离线
发送短消息息给wangxilu 加好友    发送短消息息给wangxilu 发消息
发表于: IP:您无权察看 2013-4-12 9:57:24 | [全部帖] [楼主帖] 楼主

     项目里要用到xml解析,所以需要写一个java的xml解析工具类。因此特地去网上看了一下java,解析xml的例子,发现网上找到的大都只有代码例 子,在实际的过程中也出了不少问题,所以想写一篇关于xml解析的基础文章,记录一下自已在学习过程中遇到的一些问题。

           DOM(文档对象模型)是HTML和XML文档的编程接口规范,与平台和语言无关,模型定义了HTML和XML在内存中的逻辑结构,提供了访问和存取HTML和XML文档的方法,可以说要自由的操纵XML文档就要用到DOM规范。

          解析XML的第一步是要获得一个文档解析器,将一个XML文档转化为一个DOM文档。Document接口描述了对应于整个XML的文档树,并提供了对数据的访问

// 先获取产生DocumentBuilder工厂
//在通过这个工厂产生一个XML文档解析器(DocumentBuilder)
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
// 这个Document就是一个XML文件在内存中的镜像
//把要解析的 XML 文档转化为输入流,以便 DOM 解析器解析它
doc = db.parse(new File(xmlFile));


       在一个XML文档里只一个根元素,获取的方法为   Element element = doc.getDocumentElement();

          在XML中获取一个节点可以根据其节点的名称获取  

NodeList nodeList = doc.getElementsByTagName(nodeName);


北京联动北方科技有限公司

例如在这里获取node1里数据:

写道

public class OwnXmlReslove {
      private Document doc = null;
      public void init(String filePath) throws Exception{
            File file = new File(filePath);
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            doc = builder.parse(file);
      }
      public NodeList getHeadNode(String filePath,String nodeName) throws Exception{
            init(filePath);
            return doc.getElementsByTagName(nodeName);
      }
      public static void main(String[] args) {
            OwnXmlReslove xmlre = new OwnXmlReslove();
            try {
                  NodeList nodelist = xmlre.getHeadNode("D://PropertyRW/src/Wapper.xml", "classification");
                  NodeList node = nodelist.item(0).getChildNodes();
                  int length = node.getLength();
                  for(int i = 0; i < length; i++){
                        Node no = node.item(i);
                        if(no instanceof Element){
                              System.out.println(no.getAttributes().getNamedItem("name").getNodeValue());
                              System.out.println(no.getAttributes().getNamedItem("ename").getNodeValue());
                              System.out.println(no.getAttributes().getNamedItem("id").getNodeValue());
                        }
                  }
            } catch (Exception e) {
                  e.printStackTrace();
            }
      }
}


   这里的init()方法是获取一个xml解析器并把Document对象初始化。getHeadNode这个是因为在程序里会根据不同的名称获取不同的NodeList对象,所以我把它提取了出来。

      在main函数中 ,先获取标签名称为<classification>的文档对象,item(0)是获取集合的第一个对象。应该是要遍历获取但我这里在测试所 以偷了一个小懒。再尝试获取<classification name="subject">的所有子节点。然后遍历他的所有子节点。然后判断node是否是一个元素节点,一个父节点的子节点可能有元素节点和 文本节点等,这里我还不太清楚。除了元素节点和文本节点是否还有其他的节点。

    如果是元素节点那么通过getAttribute()方法获取当前节点的属性值,再根据名称的标签来获取元素的的值。如果需要获取node2节点 里面的值那么还需要遍历一遍历node1节点,获取node1节点里的所有子节点,然后判断是否是元素节点,然后循环输出即可。

最后输出:

北京联动北方科技有限公司

后来我在其他的文章里看到在循环遍历的时候有更好的写法,贴上来大家可以看下

写道

for(Node node=book.getFirstChild(); node != null; node=node.getNextSibling()) {
      if(node.getNodeType()==Node.ELEMENT_NODE) {
            if(node.getNodeName().equals("name")) {
                  String name=node.getNodeValue();
                  String name1=node.getFirstChild().getNodeValue();
                  System.out.println(name);
                  System.out.println(name1);
            }
            if(node.getNodeName().equals("price")) {
                  String price=node.getFirstChild().getNodeValue();
                  System.out.println(price);
            }
      }
}




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论