`

java对xml文件的解析(存在特殊文字和父子节点同名)

    博客分类:
  • java
 
阅读更多

1.存在特殊字符请参考:http://blog.csdn.net/zhutulang/article/details/37736407

2.父子节点同名可以通过count计数的方式避免,具体代码如下:

public  static void main(String [] args){
	     
		 
	     try {  
	            FileInputStream input = new FileInputStream(tmpFileStr+"/"+"farfetch.xml");  
	            List<HashMap<String, String>> list = _readXml(input, "product");
	            
        	    String starttime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
	    		System.out.println("---"+starttime+"--------Farfetch开始更新-----------");

 

 public static List<HashMap<String, String>> _readXml(InputStream input, String nodeName){  
	        try {  
	            SAXParserFactory spf = SAXParserFactory.newInstance();  
	            SAXParser parser = spf.newSAXParser();  
	            SaxHandler handler = new SaxHandler(nodeName);  
	            parser.parse(input, handler);
	            input.close();  
	            return handler.getList();  
	        } catch (ParserConfigurationException e) {  
	            e.printStackTrace();  
	        } catch (SAXException e) {  
	            e.printStackTrace();  
	        } catch (IOException e) {  
	            e.printStackTrace();  
	        }  
	        return null;  
	    }  

 核心代码:

package tools;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;




public class SaxHandler extends DefaultHandler {
   
	 private HashMap<String, String> map = null;  
	    private List<HashMap<String, String>> list = null;  
	    /** 
	     * 正在解析的元素的标签 
	     */  
	    private String currentTag = null;  
	    /** 
	     * 正在解析的元素的值 
	     */  
	    private String currentValue = null;  
	    private String nodeName = null;  
	    
	    //计算第几次进入结束标签,避免两个同名porduct出问题
	    int count =0;
	    //对于含有特殊字符的URL解析时进行拼接
	    StringBuilder sb = new StringBuilder();  
	    
	    public List<HashMap<String, String>> getList(){  
	        return list;  
	    }  
	  
	    public SaxHandler(String nodeName) {  
	        this.nodeName = nodeName;  
	    }  
	  
	    @Override  
	    public void startDocument() throws SAXException {  
	        // TODO 当读到一个开始标签的时候,会触发这个方法  
	        list = new ArrayList<HashMap<String,String>>();  
	    }  
	  
	    @Override  
	    public void startElement(String uri, String localName, String name,  
	            Attributes attributes) throws SAXException {  
	        // TODO 当遇到文档的开头的时候,调用这个方法  
	    	sb.setLength(0);
	    	
	        if(name.equals(nodeName) && map == null){  
	            map = new HashMap<String, String>();  
	        }
	        
	        /****对两个相同的属性名进行特殊处理 start*****/
	        if("discount".equals(name)){
	        	map.put("discount_currency", attributes.getValue("currency"));
	        	attributes = null;
	        }
	        if("price".equals(name)){
	        	map.put("price_currency", attributes.getValue("currency"));
	        	attributes = null;
	        }
	        /****对两个相同的属性名进行特殊处理 end*****/
	        
	        if(attributes != null && map != null){  
	            for(int i = 0; i < attributes.getLength();i++){  
	                map.put(attributes.getQName(i), attributes.getValue(i));  
	            }  
	        }  
	        currentTag = name;  
	    }  
	      
	    @Override  
	    public void characters(char[] ch, int start, int length)  
	            throws SAXException {  
	        // TODO 这个方法用来处理在XML文件中读到的内容  
	    	System.out.println("characters()");
	        if(currentTag != null && map != null){  
	            currentValue = new String(ch, start, length);  
	            if(currentValue != null && !currentValue.trim().equals("") && !currentValue.trim().endsWith("\n")){  
	            	sb.append(currentValue);
	                map.put(currentTag, sb.toString());  
	            }  
	        }  
//	        currentTag=null;  
//	        currentValue=null;  
	    }  
	  
	    @Override  
	    public void endElement(String uri, String localName, String name)  
	            throws SAXException {  
	        // TODO 在遇到结束标签的时候,调用这个方法  
	    	System.out.println("endElement()");
	        if(name.equals(nodeName)){  
			    if (count > 0) {
			    	list.add(map);
			    	map = null;
			    	count = 0;
			    }
	            count++;
	        }  
	        currentTag = null;
	        currentValue=null;
	        super.endElement(uri, localName, name);  
	    }  
}

 xml文件具体内容如下:

<?xml version="1.0" encoding="utf-8"?>

<merchandiser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="merchandiser.xsd">
  <header>
    <merchantId>37938</merchantId>
    <merchantName>FARFETCH.COM Australia</merchantName>
    <createdOn>12/05/2015 07:22:29</createdOn>
  </header>  
  <product product_id="10100630" name="WERKSTATT:MÜNCHEN leather belt" sku_number="10100630" manufacturer_name="WERKSTATT:MÜNCHEN">
    <category>
      <primary>Accessories</primary>
      <secondary>Belts</secondary>
    </category>
    <URL>
      <product>http://click.linksynergy.com/link?id=DGme2yum/2Y&amp;offerid=389625.10100630&amp;type=15&amp;murl=http%3A%2F%2Fwww.farfetch.com%2Fshopping%2Fmen%2Fitem10100630.aspx</product>
      <productImage>http://cdn-images.farfetch.com/10/10/06/30/10100630_579509_800.jpg</productImage>
    </URL>
    <description>
      <short>Black leather belt from Werkstatt: Munchen featuring a silver buckle and silver loop.</short>
    </description>
    <discount currency="AUD">
      <type>amount</type>
    </discount>
    <price currency="AUD">
      <retail>1265.42</retail>
    </price>
    <brand>WERKSTATT:MÜNCHEN</brand>
    <shipping>
      <availability>in-stock</availability>
    </shipping>
    <pixel>http://ad.linksynergy.com/fs-bin/show?id=DGme2yum/2Y&amp;bids=389625.10100630&amp;type=15&amp;subid=0</pixel>
    <attributeClass class_id="60">
      <Product_Type>Accessories</Product_Type>
      <Size>S</Size>
      <Color>Black</Color>
      <Gender>Male</Gender>
    </attributeClass>
  </product>  
  <product product_id="10100676" name="WERKSTATT:MÜNCHEN leather belt" sku_number="10100676" manufacturer_name="WERKSTATT:MÜNCHEN">
    <category>
      <primary>Accessories</primary>
      <secondary>Belts</secondary>
    </category>
    <URL>
      <product>http://click.linksynergy.com/link?id=DGme2yum/2Y&amp;offerid=389625.10100676&amp;type=15&amp;murl=http%3A%2F%2Fwww.farfetch.com%2Fshopping%2Fmen%2Fitem10100676.aspx</product>
      <productImage>http://cdn-images.farfetch.com/10/10/06/76/10100676_579578_800.jpg</productImage>
    </URL>
    <description>
      <short>Black leather belt from Werkstatt: Munchen featuring a silver buckle and leather loop.</short>
    </description>
    <discount currency="AUD">
      <type>amount</type>
    </discount>
    <price currency="AUD">
      <retail>1539.03</retail>
    </price>
    <brand>WERKSTATT:MÜNCHEN</brand>
    <shipping>
      <availability>in-stock</availability>
    </shipping>
    <pixel>http://ad.linksynergy.com/fs-bin/show?id=DGme2yum/2Y&amp;bids=389625.10100676&amp;type=15&amp;subid=0</pixel>
    <attributeClass class_id="60">
      <Product_Type>Accessories</Product_Type>
      <Size>S-M-L-XL</Size>
      <Color>Black</Color>
      <Gender>Male</Gender>
    </attributeClass>
  </product>  
  <product product_id="10212594" name="SCUNZANI IVO toad skin belt" sku_number="10212594" manufacturer_name="SCUNZANI IVO">
    <category>
      <primary>Accessories</primary>
      <secondary>Belts</secondary>
    </category>
    <URL>
      <product>http://click.linksynergy.com/link?id=DGme2yum/2Y&amp;offerid=389625.10212594&amp;type=15&amp;murl=http%3A%2F%2Fwww.farfetch.com%2Fshopping%2Fmen%2Fitem10212594.aspx</product>
      <productImage>http://cdn-images.farfetch.com/10/21/25/94/10212594_1130649_800.jpg</productImage>
    </URL>
    <description>
      <short>Green and black toad skin belt from Scunzani Ivo featuring a silver-tone buckle. Please note that this item cannot be shipped outside the E.U.</short>
    </description>
    <discount currency="AUD">
      <type>amount</type>
    </discount>
    <price currency="AUD">
      <retail>461.25</retail>
    </price>
    <brand>SCUNZANI IVO</brand>
    <shipping>
      <availability>in-stock</availability>
    </shipping>
    <pixel>http://ad.linksynergy.com/fs-bin/show?id=DGme2yum/2Y&amp;bids=389625.10212594&amp;type=15&amp;subid=0</pixel>
    <attributeClass class_id="60">
      <Product_Type>Accessories</Product_Type>
      <Size>M-L</Size>
      <Color>Green</Color>
      <Gender>Male</Gender>
    </attributeClass>
  </product>  
  <product product_id="11249583" name="JIL SANDER VINTAGE straight leg trousers" sku_number="11249583" manufacturer_name="JIL SANDER VINTAGE">
    <category>
      <primary>Vintage &amp; Archive</primary>
      <secondary>Trousers</secondary>
    </category>
    <URL>
      <product>http://click.linksynergy.com/link?id=DGme2yum/2Y&amp;offerid=389625.11249583&amp;type=15&amp;murl=http%3A%2F%2Fwww.farfetch.com%2Fshopping%2Fwomen%2Fitem11249583.aspx</product>
      <productImage>http://cdn-images.farfetch.com/11/24/95/83/11249583_6003611_800.jpg</productImage>
    </URL>
    <description>
      <short>Sky grey linen-wool blend straight leg trousers from Jil Sander Vintage featuring a button and zip fly, side pockets and a back pocket. Circa 1990. Please note that vintage items are not new and therefore might have minor imperfections.</short>
    </description>
    <discount currency="AUD">
      <type>amount</type>
    </discount>
    <price currency="AUD">
      <retail>189.77</retail>
    </price>
    <brand>JIL SANDER VINTAGE</brand>
    <shipping>
      <availability>in-stock</availability>
    </shipping>
    <pixel>http://ad.linksynergy.com/fs-bin/show?id=DGme2yum/2Y&amp;bids=389625.11249583&amp;type=15&amp;subid=0</pixel>
    <attributeClass class_id="60">
      <Product_Type>Vintage &amp; Archive</Product_Type>
      <Size>36</Size>
      <Color>Grey</Color>
      <Gender>Female</Gender>
    </attributeClass>
  </product>  
  <trailer>
    <numberOfProducts>118204</numberOfProducts>
  </trailer>
</merchandiser>

 

 

分享到:
评论

相关推荐

    msxml解析xml同名节点

    ### msxml解析XML同名节点知识点详解 #### 一、MSXML简介 MSXML(Microsoft XML)是由微软公司开发的一套用于处理XML文档的技术。它提供了多种编程接口,包括COM接口,使得开发者能够轻松地在各种.NET框架之外的...

    java解析XML文件

    Java解析XML文件是Java开发中常见的一项任务,XML(eXtensible Markup Language)作为一种结构化数据存储格式,被广泛用于数据交换、配置文件和Web服务等场景。本篇文章将详细探讨Java如何利用DOM4J库来解析XML文件...

    使用java解析XML文件,解析完之后将解析结果导入mysql数据库中

    在Java编程环境中,解析XML文件是一项常见的任务,特别是在数据处理和集成中。XML(Extensible Markup Language)是一种结构化数据格式,广泛用于存储和传输数据。本教程将介绍如何使用Java解析XML文件,并将解析...

    java心电图xml解析.zip

    在Java中,有多种方式可以解析XML文档,主要包括DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)。每种方法都有其优缺点,适用于不同的场景。 1. DOM解析:DOM是将整个...

    java 解析xml 多级

    同时,考虑到性能和资源消耗,对于非常大的XML文件,可能需要考虑使用SAX解析或者StAX(Streaming API for XML)。 总结来说,Java提供了多种解析XML的方法,包括DOM、SAX和JAXB等。对于处理多级嵌套的XML,DOM和...

    java xml文件解析

    在Java中,有多种解析XML文件的方式,包括DOM (Document Object Model)、SAX (Simple API for XML) 和 DOM4J。这些方法各有优势和局限性,选择哪一种取决于具体的应用场景和需求。 #### 二、DOM 解析方式 DOM 解析...

    JAVA JAXB 解析XML嵌套子节点为字符串

    当我们面临XML文档中存在嵌套子节点,并且希望将其解析为字符串时,JAXB提供了一种有效的方法。 首先,我们需要理解XML文档的基本结构。XML是一种可扩展标记语言,它通过标签来定义元素和数据,允许数据以层次结构...

    java 解析XML性能对比分析Demo

    在"Java解析XML性能对比分析Demo"中,你可以通过运行这些解析器的示例代码,观察它们在处理相同XML文件时的内存占用、处理速度等指标,以了解哪种解析方式更适合你的项目需求。例如,如果你处理的XML文件较小,DOM或...

    解析XML特殊字符方法

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用在互联网上,尤其是在数据交换、配置文件和文档存储等领域。在XML文档中,有些字符是具有特殊含义的,例如 `、`&gt;` 和 `&` 等,它们分别用于...

    java 解析xml获取节点内容

    本教程将详细讲解如何在Java中解析XML文件,获取节点内容,且无需引入额外的jar包,如DOM、SAX或StAX解析器。 首先,Java标准库提供了`java.io`和`javax.xml.parsers`包,它们包含了基本的XML处理能力。这里我们将...

    java 使用JDOM解析xml文件.docx

    在 Java 中,解析 XML 文件是一件常见的任务,而 JDOM 是一个流行的开源库,用于解析和处理 XML 文件。本文将详细介绍如何使用 JDOM 解析 XML 文件。 JDOM 介绍 JDOM 是一个开源项目,基于树型结构,利用纯 Java ...

    JDOM解析同名多节点的XML源代码

    同名多节点意味着XML文档中可能存在多个具有相同标签名的元素,比如 `&lt;student&gt;` 节点可能重复出现,每个学生节点可能有如 `name`、`age` 等多个属性来表示具体信息。 JDOM提供了两种主要的解析方式:SAX和DOM。SAX...

    C# xml多个同名节点操作

    方便对xml中任意节(多个同名节点)点属性进行获取、设置。 /// /// 设置指定节点的属性 /// /// &lt;param name="xmlContent"&gt;xml结构 /// 父节点 /// 父节点所处同名节点的位置 为0表明只有一个该节点 /// ...

    Java解析XML文件的DOM和SAX方式.doc

    Java 解析 XML 文件的 DOM 和 SAX 方式是指在 Java 中使用 Document Object Model(DOM)和 Simple API for XML(SAX)两种方式来解析 XML 文件的技术。下面将详细介绍这两种方式的原理、实现和优缺点。 DOM 方式 ...

    Java中如何解析XML文件

    Java中如何解析XML文件,创建xml文件,增、删、改、查 xml节点信息

    自己写的java对xml文件操作的类

    1. **XML文件读取**:通常,你可以使用`java.io.File`和`javax.xml.parsers.DocumentBuilderFactory`来打开并解析XML文件。解析后,你可以通过`Document`对象访问XML的根节点,然后遍历整个文档结构。 2. **属性和...

    java读写xml文件

    在Java编程中,对XML文件进行读取与写入是一项非常常见的任务。XML(可扩展标记语言)是一种用于标记数据的语言,非常适合用来存储和传输数据。Java提供了多种API来处理XML文件,包括SAX、DOM以及更现代的JSoup等。...

    xml解析例子得到各个节点信息

    在Java中,解析XML文件是常见的任务,这通常涉及到提取XML文档中的节点信息和属性。以下是一些关于XML解析的重要知识点: 1. **DOM解析器**: DOM(文档对象模型)解析器将整个XML文档加载到内存中,形成一个树形...

    C写的解析xml文件源代码

    本文将深入探讨使用C语言编写的XML文件解析源码,并讲解如何实现XML文件的基本操作,如查找、增加和删除节点。 在C语言中处理XML文件通常涉及到以下几个关键步骤: 1. **内存管理**:由于C语言没有内置的高级数据...

    读取XML文件的四种方法

    在Java中,读取XML文件有多种方法,本文将介绍四种常见的方法:DOM、DOM4J、JDOM和SAX。 DOM(Document Object Model) DOM是W3C组织制定的XML文档对象模型,它提供了对XML文档的树形结构表示。使用DOM方法读取XML...

Global site tag (gtag.js) - Google Analytics