Android XML解析

平时习惯用Json格式来保存传递数据,xml的生成解析不太熟悉,写的有点乱

 

一个典型的xml格式文本

<?xml version="1.0" encoding="utf-8"?>
<LOL>
    <person>
        <!-- 这里是盖伦的注释 -->
        <name sex="man">盖伦</name>
        <address>德玛西亚</address>
        <say>我将带头冲锋</say>
    </person>
    <person>
        <!-- 这里是亚索的注释 -->
        <name sex="man">亚索</name>
        <address>艾欧尼亚</address>
        <say>死亡如风,常伴吾身</say>
    </person>
    <person>
        <!-- 这里是瑞雯的注释 -->
        <name sex="girl">瑞雯</name>
        <address>诺克萨斯</address>
        <say>战争与谋杀之间,潜藏着我们的心魇</say>
    </person>
</LOL>

 

 

Pull解析

创建实例

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

factory.setNamespaceAware(true);

XmlPullParser xpp = factory.newPullParser();

(也可以通过Xml.newPullParser()得到)

xpp.setInput ( new FileReader (filename ) );

五个事件类型

there is only one key method next() that is used to retrieve next event and there are only five events:

START DOCUMENT:文档开始时,解析器还没有读取任何数据

START_TAG:解析到标签开头

TEXT:解析到元素的内容

END_TAG:解析在标签的末尾

END_DOCUMENT:文档结束,之后不会再解析了

主要方法

getName()

getText()

next(),nextToken()

setInput(InputStream, String)

getEventType()

getAttributeName,getAttributeValue

示例代码

public void pullParse(View view) {

    String xmlData = getXMLData(fileName);
    try {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance()
        XmlPullParser xmlPullParser = factory.newPullParser();
        xmlPullParser.setInput(new StringReader(xmlData));
        int eventType = xmlPullParser.getEventType();
        String name = "";
        String address = "";
        String say = "";
        String sex = "";
        while (eventType != XmlPullParser.END_DOCUMENT) {
            String nodeName = xmlPullParser.getName();
            switch (eventType) {
                case XmlPullParser.START_TAG: {
                    if ("name".equals(nodeName)) {
                        // sex与name的位置不能互换
              // sex = xmlPullParser.getAttributeValue(0);
                        sex = xmlPullParser.getAttributeValue(null, "sex");
                        name = xmlPullParser.nextText();
                    } else if ("address".equals(nodeName)) {
                        address = xmlPullParser.nextText();
                    } else if ("say".equals(nodeName)) {
                        say = xmlPullParser.nextText();
                    }
                    break;
                }
                // 完成解析某个结点
                case XmlPullParser.END_TAG: {
                    if ("person".equals(nodeName)) {
                        Log.d(TAG, "name: " + name);
                        Log.d(TAG, "address: " + address);
                        Log.d(TAG, "say: " + say);
                        Log.d(TAG, "sex: " + sex);
                    }
                    break;
                }
                default:
                    break;
            }
            eventType = xmlPullParser.next();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

XmlSerializer生成XML

 

两种获取实例

XmlSerializer serializer = Xml.newSerializer();

xmlPullParserFactory=XmlPullParserFactory.newInstance();

XmlSerializer serializer = xmlPullParserFactory.newSerializer();

主要方法

setOutput

startDocument

startTag

attribute

text

endTag

endDocument

 

示例代码

try {
    XmlSerializer serializer = Xml.newSerializer();
    OutputStream outputStream = System.
out;
    serializer.setOutput(outputStream,
"UTF-8");
    serializer.startDocument(
"UTF-8", true);
    serializer.startTag(
null, "persons");
    serializer.startTag(
null, "person");
    serializer.attribute(
null, "id", String.valueOf(10));
    serializer.text(
"小明");
    serializer.endTag(
null, "person");
    serializer.endTag(
null, "persons");
    serializer.endDocument();
}
catch (IOException e) {
    e.printStackTrace();
}

 

 

 

 

SAX解析

示例

实体类继承DefaultHandler

SAXParserFactory factory = SAXParserFactory.newInstance();

XMLReader xmlReader = factory.newSAXParser().getXMLReader();

ContentHandler handler = new ContentHandler();

// 将ContentHandler的实例设置到XMLReader中

xmlReader.setContentHandler(handler);

// 开始执行解析

xmlReader.parse(new InputSource(new StringReader(xmlData)));

 

 

XML命名空间

 

XML Namespace (xmlns) 属性

XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:

xmlns:namespace-prefix="namespaceURI"

当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。

 

XML 命名空间提供避免元素命名冲突的方法。两个文档使用了不同的命名空间来命名它们的<table>元素 (<h:table>和<f:table>)。通过使用前缀,我们创建了两种不同类型的<table>元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值