WebService之XML解析

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">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值