`
liangoogle
  • 浏览: 279649 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

xml 解析的三种方法

阅读更多

 

dom解析:

 

public class DOMPersonService

{

public static List<Person> readXml(InputStream inStream) throws Exception

{

List<Person> persons=new ArrayList<Person>();

//实例化一个文档构建器工厂

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

//通过文档构建器工厂获取一个文档构建器

DocumentBuilder builder = factory.newDocumentBuilder();

//通过文档通过文档构建器构建一个文档实例

Document document = builder.parse(inStream);

Element root = document.getDocumentElement();

                //获取所有"pre:person"节。点

NodeList nodes = root.getElementsByTagName("pre:person");

for(int i = 0 ;i < nodes.getLength();i++)

{

Element personElement = (Element)nodes.item(i);

Person person =new Person();

person.setId(Integer.valueOf(personElement.getAttribute("id")));

NodeList childNodes = personElement.getChildNodes();

for(int j = 0;j<childNodes.getLength();j++)

{

Node childNode = (Node)childNodes.item(j);

if (childNode.getNodeType()==Node.ELEMENT_NODE)

{

Element childElement = (Element)childNode;

if ("name".equals(childElement.getNodeName()))

{

person.setName(childElement.getFirstChild().getNodeValue());

}

else if (("age".equals(childElement.getNodeName())))

{

person.setAge(new Short(childElement.getFirstChild().getNodeValue()));

}

}

}

persons.add(person);

}

return persons;

}

}


调用此类测试:
public class DOMPersonServiceTest extends AndroidTestCase
{
private static final String TAG="PersonServiceTest";
public void testReadXml() throws Exception
{
InputStream inStream=DOMPersonServiceTest.class.getClassLoader().getResourceAsStream("person.xml");
               //解析出的xml
List<Person> persons=DOMPersonService.readXml(inStream);
for (Person person : persons)
{
Log.i(TAG, person.toString());
}
}
}

SAX解析:

public class SAXPersonService
{
public static List<Person> readXml(InputStream inStream) throws Exception
{
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser saxParser=spf.newSAXParser();//创建解析器
XMLContentHandler handler=new XMLContentHandler();
saxParser.parse(inStream, handler);
inStream.close();
return handler.getPersons();
}
}

关键是要实现这个方法:
public class XMLContentHandler extends DefaultHandler
{
private static final String TAG = "XMLContentHandler";
private List<Person> persons;
private Person person;
private String preTag;
public List<Person> getPersons()
{
return persons;
}
@Override
public void startDocument() throws SAXException
{
persons = new ArrayList<Person>();
Log.i(TAG, "开始解析...");
}
/**
* uri:命名空间
* localName:不带命名空间前缀的标签名
* qName:带命名空间前缀的标签名
* attributes:属性集合
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
{
if ("person".equals(localName))
{
person = new Person();
person.setId(new Integer(attributes.getValue("id")));
}
preTag = localName;
Log.i(TAG, "解析元素:"+localName);
}
/**
* ch[]:内容
* start:其实位置
* length:长度
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException
{
if (person!=null)
{
String data = new String(ch, start,length);
if ("name".equals(preTag))
{
person.setName(data);
}
else if ("age".equals(preTag))
{
person.setAge(new Short(data));
}
}
Log.i(TAG, "解析内容:"+new String(ch, start,length));
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException
{
if ("person".equals(localName)&&person!=null)
{
persons.add(person);
person = null;
}
preTag = null;
Log.i(TAG, localName + "解析完毕");
}

@Override
public void endDocument() throws SAXException
{
super.endDocument();
Log.i(TAG, "文档解析完毕");
}
}

调用测试:
public class SAXPersonServiceTest extends AndroidTestCase
{
private static final String TAG="SAXPersonServiceTest";
public void testReadXml() throws Exception
{
InputStream inStream=SAXPersonServiceTest.class.getClassLoader().getResourceAsStream("person.xml");
List<Person> persons=SAXPersonService.readXml(inStream);
for (Person person : persons)
{
Log.i(TAG, person.toString());
}
}
}

3 PULL解析
public class PullPersonService
{
public static List<Person> readXml(InputStream inStream) throws Exception
{
List<Person> persons=null;
XmlPullParser parser=Xml.newPullParser();
parser.setInput(inStream, "UTF-8");
int eventCode=parser.getEventType();
Person person=null;
while(eventCode!=XmlPullParser.END_DOCUMENT)
{
switch (eventCode)
{
case XmlPullParser.START_DOCUMENT: //0 文档开始事件
persons=new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:  //2 开始元素
if ("person".equals(parser.getName()))
{
person=new Person();
person.setId(new Integer(parser.getAttributeValue(0)));
}
else if(null!=person)
{
if ("name".equals(parser.getName()))
{
person.setName(parser.nextText());
}
else if("age".equals(parser.getName()))
{
person.setAge(new Short(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG: //结束元素
if ("person".equals(parser.getName())&&person!=null)
{
persons.add(person);
person=null;
}
break;
}
eventCode=parser.next();
}
return persons;
}
}

调用测试

public class PullPersonServiceTest extends AndroidTestCase
{
private static final String TAG="PersonServiceTest";
public void testReadXml() throws Exception
{
InputStream inStream=PullPersonServiceTest.class.getClassLoader().getResourceAsStream("person.xml");
List<Person> persons=PullPersonService.readXml(inStream);
for (Person person : persons)
{
Log.i(TAG, person.toString());
}
}
}

要解析的文件:
person.xml
<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns:pre="http://www.baidu.com">
<pre:person id="001">
<name>coolszy</name>
<age>22</age>
</pre:person>
<pre:person id="002">
<name>kuka</name>
<age>22</age>
</pre:person>
</persons>

如果为网络的话,可以直接获得流:

InputStream inputStream = urlConn.getInputStream();

解析的内容存储:
public class Person
{
private Integer id;
private String name;
private Short age;
public Person()
{
super();
}
public Person(Integer id, String name, Short age)
{
super();
this.id = id;
this.name = name;
this.age = age;
}

public Integer getId()
{
return id;
}

public void setId(Integer id)
{
this.id = id;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public Short getAge()
{
return age;
}

public void setAge(Short age)
{
this.age = age;
}

@Override
public String toString()
{
return "id=" + getId() + ",name=" + getName() + ",age=" + getAge();
}
}
分享到:
评论

相关推荐

    三种解析XML的方法

    在Java中,有三种主要的XML解析方法:DOM(Document Object Model)、SAX(Simple API for XML)和dom4j。每种方法都有其特点和适用场景,下面将详细阐述这三种解析方法。 1. DOM解析: DOM解析器将整个XML文档加载...

    易语言 xml解析 易语言 xml解析 教程 带源码

    易语言XML解析是编程领域中的一个重要主题,尤其对于使用易语言进行开发的程序员来说,理解并掌握XML(可扩展标记语言)的解析方法是至关重要的。XML作为一种结构化数据存储和交换格式,广泛应用于网络通信、配置...

    xml三种解析方法实现

    XML(eXtensible Markup Language)是一种用于存储和传输...在项目中,选择合适的XML解析方法至关重要,因为它直接影响到程序的性能和可维护性。了解并掌握这三种解析方式,可以帮助开发者针对不同的场景做出最佳决策。

    Java 解析 xml 3种方法

    Java XML解析是开发中常见的任务,它涉及到将XML文档转换为程序可以操作的数据结构。XML(eXtensible Markup Language)是一种标记语言,常用于数据交换、配置存储等场景。在Java中,有多种方式来解析XML,主要包括...

    java xml解析工具类 java xml解析工具类

    java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析...

    xml解析文件的两种方式

    本文将详细介绍XML解析文件的两种主要方式:SAX(Simple API for XML)和DOM(Document Object Model)。 **1. DOM解析** DOM解析方式是将整个XML文档加载到内存中,构建一个树形结构,称为DOM树。这个树的每个...

    XML的三种解析方式

    本篇文章将详细探讨XML的三种主要解析方式:DOM(Document Object Model)、SAX(Simple API for XML)和PULL(Pull Parsing)。 1. DOM解析: DOM解析器将整个XML文档加载到内存中,创建一个树形结构的文档对象...

    Android 解析 XML 三种方法

    了解这些解析方法后,你可以通过Android SDK提供的API实现XML解析,如`SAXParser`、`DocumentBuilderFactory`(用于DOM)和`XmlPullParser`(用于PULL)。在实际编码过程中,记得为解析异常添加适当的错误处理,以...

    XML解析器示例

    在LabVIEW(Laboratory Virtual Instrument Engineering Workbench)这个强大的图形化编程环境中,XML解析器是处理和操作XML数据的关键工具。本示例主要展示了如何在LabVIEW中实现XML文件的加载、保存和解析。 首先...

    比较通用的xml解析方法

    本篇文章将详细探讨一种比较通用的XML解析方法,适用于各种编程环境。 在处理XML文件时,我们通常会遇到两种主要的解析方式:DOM(Document Object Model)和SAX(Simple API for XML)。DOM将整个XML文档加载到...

    xml 解析 xml 解析几何

    总之,XML解析是处理XML数据的关键步骤,DOM和SAX是两种主要的解析方式,各有优缺点。Java提供了强大的XML处理库,使得在Java项目中使用XML变得简单高效。无论是解析配置文件、交换数据还是构建复杂的XML结构,理解...

    XML解析的三种方法

    ### XML解析的三种方法在Android平台上的应用 在Android开发中,XML文件的解析是一项常见的需求,主要用于处理配置文件或轻量级数据交换格式。本文将深入探讨三种主流的XML解析方法:SAX(Simple API for XML)、...

    4种解析XML方法实例

    本教程将详细介绍四种常见的XML解析方法,以帮助你更好地理解和处理XML数据。 1. DOM解析器(Document Object Model) DOM解析器将整个XML文档加载到内存中,创建一个树形结构,允许开发者通过节点操作来访问和修改...

    XMl3种解析方法

    在选择XML解析方法时,需要根据具体应用场景和需求来决定。如果XML文件较小,且需要频繁访问和修改数据,DOM可能是合适的选择。而如果处理大型XML文件,或者关心性能和内存使用,SAX和PULL则更为理想。PULL解析器在...

    解析XML的三种方式

    XML(Extensible Markup Language)可拓展标记语言,它与HTML一样,都是SGML...在Android下有三种方式解析XML,分别为SAX、DOM、PULL;它们有各自的特点,在网络编程中会经常使用,根据实际情况选择哪一种解析方式。

    C# XML解析方式

    - **简介**:在.NET框架中,`XMLTextReader`是一种高效的流式XML解析器,适用于处理大型XML文档或当只需要读取文档的部分内容时。 - **特点**: - **内存效率**:不会将整个XML文档加载到内存中,而是逐行读取和...

    android xml三种解析方式

    本篇将详细探讨Android中的三种XML解析方式:DOM解析、SAX解析和Pull解析。 1. DOM解析(Document Object Model) DOM解析器会将整个XML文档加载到内存中,构建一个树形结构,称为DOM树。这种解析方式的优点是能够...

    XML解析工具

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,...

    android XML三种解析及生成

    本文将深入探讨Android中的三种XML解析方式:SAX(Simple API for XML)、Pull Parser和DOM(Document Object Model),以及如何生成XML文件。 ### 1. SAX解析 SAX解析器是基于事件驱动的解析模型,它逐行读取XML...

    详解Java解析XML的四种方法

    本文将深入探讨Java解析XML的四种主要方法。 1. DOM(Document Object Model)解析: DOM解析器将整个XML文档加载到内存中,创建一个树形结构,允许开发者通过节点遍历和操作XML。例如,Java的`javax.xml.parsers....

Global site tag (gtag.js) - Google Analytics