WebService之XML解析

来源:互联网 发布:支付宝对淘宝的帮助 编辑:程序博客网 时间:2024/05/22 15:46
1.SAX解析,是一行一行的把xml文件读到内存,通过是时间通知的方式来解析的,有点比较省内存,适合与移动开发。
package com.hw;
import java.io.StringWriter;
import java.util.LinkedList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
public class SAXhw extends DefaultHandler {
    private static final String _MY_MESSAGE_NAMESPACE_URI = "http://schemas.xmlsoap.org/wsdl/";
    private static final String _MESSAGE_ELEMENT_NAME = "message";
    private static final String _OPERATION_BINDING_NAME = "operation";
    private static final String _BINDING_NAME = "binding";
    private boolean _messageFound = false;
    private boolean _operationFound = false;
    private boolean _bindingFound = false;
    private boolean _bindingIsOver = true;
    private LinkedList _messages = new LinkedList();
    private LinkedList _operationName = new LinkedList();

    public void startElement(String namespaceURI,
    String localName,
    String qualifiedName,
    Attributes attributes)
    throws SAXException
    {
        _messageFound = namespaceURI.toLowerCase().equals(
                _MY_MESSAGE_NAMESPACE_URI)
                &&
                localName.toLowerCase().equals(_MESSAGE_ELEMENT_NAME);
        if (_messageFound) {
            _messages.add(attributes.getValue(0).toString());
        }
        //The work 2:
        _bindingFound = namespaceURI.toLowerCase().equals(
                _MY_MESSAGE_NAMESPACE_URI)
                &&
                localName.toLowerCase().equals(_BINDING_NAME);
        if (_bindingFound) {
            _bindingIsOver = false;
        }
        _operationFound = namespaceURI.toLowerCase().equals(
                _MY_MESSAGE_NAMESPACE_URI)
                &&
                localName.toLowerCase().equals(_OPERATION_BINDING_NAME);
        if (_operationFound && !_bindingIsOver) {        
            _operationName.add(attributes.getValue(0));                 
        }
    }
    public void endElement(String namespaceURI, String localName, String qualifiedName)
    throws SAXException
    {
        _bindingFound = namespaceURI.toLowerCase().equals(
                _MY_MESSAGE_NAMESPACE_URI)
                &&
                localName.toLowerCase().equals(_BINDING_NAME);
        if (_bindingFound) {
            _bindingIsOver = true;
        }
        _messageFound = false;
        _bindingFound = false; 
        _operationFound = false;
    }
    public StringWriter outputAllNames()
    {
        StringWriter sw = new StringWriter();
        sw.write("The all message names:\n");
        for (int i = 0; i < _messages.size(); i++){
            sw.write((i + 1) + ":" + (String) _messages.get(i) + "\n");
        }
        return sw;
    }
    public StringWriter outputOperationNames() {
        StringWriter sw = new StringWriter();
        sw.write("The all operation names of binding element:\n");
        for (int i = 0; i < _operationName.size(); i++) {
            sw.write((i + 1) + ":" + (String) _operationName.get(i) + "\n");
        }
        return sw;
    }
    public static void main(String[] args) throws Exception
    {
        SAXhw saxHx = new SAXhw();
        XMLReader parser = null;
        try
        {
            parser = XMLReaderFactory
                    .createXMLReader("org.apache.xerces.parsers.SAXParser");
            parser.setContentHandler(saxHx);
        }
        catch (Exception e)
        {
            System.err.println("Unable to create Xerces SAX parser - check classpath");
        }
        try
        {
            parser.parse("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
            System.out.println(saxHx.outputAllNames().toString());
            System.out.println(saxHx.outputOperationNames().toString());
        }
        catch (Exception e)
        {
           e.printStackTrace();
        }
    }
}

2.DOM解析方式,它是把xml组成一个树结构,全部读入内存。比SAX内存消耗大
using System;
using System.Xml;

public class DOMExample
{
    private string getXMLDocument(string url)
    {
        System.Net.WebClient wc = new System.Net.WebClient();
        byte[] webData = wc.DownloadData(url);
        char[] charData = new char[webData.Length];
        for (int i = 0; i < charData.Length; i++)
        {
            charData[i] = (char)webData[i];
        }
        string xmlStr = new String(charData);
        int start = xmlStr.IndexOf("<", 0, xmlStr.Length - 1);
        int length = xmlStr.LastIndexOf(">") - start + 1;
        return xmlStr.Substring(start, length);
    }
    public static void Main(string[] args)
    {
        String url = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";
        DOMExample domExample = new DOMExample();
        System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
        xmlDoc.LoadXml(domExample.getXMLDocument(url));
        XmlNodeList xmlNodeList = xmlDoc.getElementsByTagName_r("message", "http://schemas.xmlsoap.org/wsdl/");
        XmlNodeList xmlBindingList = xmlDoc.getElementsByTagName_r("binding", "http://schemas.xmlsoap.org/wsdl/");
        XmlNodeList xmlOperationList;
        //The work 1:
        Console.Write("The message names is :\n");
        for (int i = 0; i < xmlNodeList.Count; i++)
        {
            Console.WriteLine(xmlNodeList.Item(i).Attributes.Item(0).Value);
        }
        //The work 2:
        Console.Write("The  operation names of binding element:\n");
        for (int i = 0; i < xmlBindingList.Count; i++)
        {
            Console.WriteLine("binding:"+ xmlBindingList.Item(i).Attributes.Item(0).Value);
            xmlOperationList = xmlBindingList.Item(i).ChildNodes;
            for (int j = 0; j < xmlOperationList.Count; j++)
            {
                if (xmlOperationList.Item(j).Name.Equals("wsdl:operation".ToString()))
                {
                    Console.WriteLine(xmlOperationList.Item(j).Attributes.Item(0).Value);
                }
            }
        }
        Console.ReadKey();
    }
}

3.XSLT:

xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="wsdl">

        "wsdl:definitions/wsdl:binding/wsdl:operation">