SAX方式解析XML檔案的方法分析,並取特定欄位生成物件
SAX(Simple API for XML)SAX的工作原理簡單地說就是對文件進行順序掃描,當掃描到文件(document)開始與結束、元素(element)開始與結束、文件(document)結束等地方時通知事件處理方法,由事件處理函式做相應動作,然後繼續同樣的掃描,直至文件結束。SAX解析方式適用於大型文件,因為他的解析是逐行進行不用像DOM中那樣為所有節點建立物件,這樣效率大大提高,所以雖然它不是W3C標準,但它卻得到了廣泛認可。
1,這是需要解析的XML
<?xml version="1.0" encoding="UTF-8"?>
<packet className="" type="字串定長報文
<reference name="報文頭" referenceFile="service/bizservice/host/head/snd_host_head1.packet"/>
<category name="body">
<field fieldDefaultValue="""" fieldDescription="省程式碼" fieldName="PROVINCECODE" fieldSubtle="false" fieldType="String" fieldValidation="false">
<valueExpr expr="PROVINCECODE"/>
<method className="StringMethod" methodName="fill">
<parameter name="fillchar" type="string" value="0"/>
<parameter name="len" type="int" value="2"/>
<parameter name="dir" type="string" value="左邊"/>
</method>
<parameter name="位置" value="-1"/>
<parameter name="偏移量" value="0"/>
<parameter name="資料格式" value="9(2)"/>
</field>
<field fieldDefaultValue="""" fieldDescription="舊賬號" fieldName="OLDACCTNO" fieldSubtle="false" fieldType="String" fieldValidation="false">
<valueExpr expr="OLDACCTNO"/>
<method className="StringMethod" methodName="fill">
<parameter name="fillchar" type="string" value=" "/>
<parameter name="len" type="int" value="23"/>
<parameter name="dir" type="string" value="右邊"/>
</method>
<parameter name="位置" value="-1"/>
<parameter name="偏移量" value="0"/>
<parameter name="資料格式" value="X(23)"/>
</field>
<field fieldDefaultValue="""" fieldDescription="偏移量(介面隱藏)" fieldName="OFFSETPOS" fieldSubtle="false" fieldType="String" fieldValidation="false">
<valueExpr expr="OFFSETPOS"/>
<parameter name="位置" value="-1"/>
<parameter name="偏移量" value="0"/>
<parameter name="資料格式" value="9(3)"/>
</field>
<field fieldDefaultValue="""" fieldDescription="賬號" fieldName="ACCTNO" fieldSubtle="false" fieldType="String" fieldValidation="false">
<valueExpr expr="ACCTNO"/>
<parameter name="位置" value="-1"/>
<parameter name="偏移量" value="0"/>
<parameter name="資料格式" value="9(17)"/>
</field>
<field fieldDefaultValue="""" fieldDescription="子賬戶型別" fieldName="SUBACCTTYPE" fieldSubtle="false" fieldType="String" fieldValidation="false">
<valueExpr expr="SUBACCTTYPE"/>
<parameter name="位置" value="-1"/>
<parameter name="偏移量" value="0"/>
<parameter name="資料格式" value="X(4)"/>
</field>
<field fieldDefaultValue="""" fieldDescription="冊號" fieldName="VOLUMENO" fieldSubtle="false" fieldType="String" fieldValidation="false">
<valueExpr expr="VOLUMENO"/>
<method className="StringMethod" methodName="fill">
<parameter name="fillchar" type="string" value="0"/>
<parameter name="len" type="int" value="3"/>
<parameter name="dir" type="string" value="左邊"/>
</method>
<parameter name="位置" value="-1"/>
<parameter name="偏移量" value="0"/>
<parameter name="資料格式" value="9(3)"/>
</field>
<field fieldDefaultValue="""" fieldDescription="序號" fieldName="SEQNO" fieldSubtle="false" fieldType="String" fieldValidation="false">
<valueExpr expr="SEQNO"/>
<method className="StringMethod" methodName="fill">
<parameter name="fillchar" type="string" value="0"/>
<parameter name="len" type="int" value="2"/>
<parameter name="dir" type="string" value="左邊"/>
</method>
<parameter name="位置" value="-1"/>
<parameter name="偏移量" value="0"/>
<parameter name="資料格式" value="9(2)"/>
</field>
<field fieldDefaultValue="""" fieldDescription="功能選項" fieldName="FunctionalOption" fieldSubtle="false" fieldType="String" fieldValidation="false">
<valueExpr expr="FunctionalOption"/>
<method className="StringMethod" methodName="fill">
<parameter name="fillchar" type="string" value=" "/>
<parameter name="len" type="int" value="1"/>
<parameter name="dir" type="string" value="右邊"/>
</method>
<parameter name="位置" value="-1"/>
<parameter name="偏移量" value="0"/>
<parameter name="資料格式" value="X"/>
</field>
<field fieldDefaultValue="""" fieldDescription="FILLER" fieldName="FILLER" fieldSubtle="false" fieldType="String" fieldValidation="false">
<valueExpr expr="FILLER"/>
<parameter name="位置" value="-1"/>
<parameter name="偏移量" value="0"/>
<parameter name="資料格式" value="9"/>
</field>
<field fieldDefaultValue="""" fieldDescription="FILLER" fieldName="FILLER" fieldSubtle="false" fieldType="String" fieldValidation="false">
<valueExpr expr="FILLER"/>
<parameter name="位置" value="-1"/>
<parameter name="偏移量" value="0"/>
<parameter name="資料格式" value="9"/>
</field>
<field fieldDefaultValue="""" fieldDescription="FILLER" fieldName="FILLER" fieldSubtle="false" fieldType="String" fieldValidation="false">
<valueExpr expr="FILLER"/>
<method className="StringMethod" methodName="fill">
<parameter name="fillchar" type="string" value=" "/>
<parameter name="len" type="int" value="34"/>
<parameter name="dir" type="string" value="右邊"/>
</method>
<parameter name="位置" value="-1"/>
<parameter name="偏移量" value="0"/>
<parameter name="資料格式" value="X(34)"/>
</field>
<field fieldDefaultValue="""" fieldDescription="FILLER" fieldName="FILLER" fieldSubtle="false" fieldType="String" fieldValidation="false">
<valueExpr expr="FILLER"/>
<method className="StringMethod" methodName="fill">
<parameter name="fillchar" type="string" value=" "/>
<parameter name="len" type="int" value="2"/>
<parameter name="dir" type="string" value="右邊"/>
</method>
<parameter name="位置" value="-1"/>
<parameter name="偏移量" value="0"/>
<parameter name="資料格式" value="X(2)"/>
</field>
<field fieldDefaultValue="""" fieldDescription="舊帳號標識" fieldName="OLDFLAG" fieldType="String">
<valueExpr expr="OLDFLAG"/>
<method className="StringMethod" methodName="fill">
<parameter name="fillchar" type="string" value="0"/>
<parameter name="len" type="int" value="2"/>
<parameter name="dir" type="string" value="左邊"/>
</method>
<parameter name="位置" value="-1"/>
<parameter name="偏移量" value="0"/>
<parameter name="資料格式" value="9(2)"/>
</field>
</category>
<parameter name="編碼" value="GBK"/>
<reference name="報文尾" referenceFile="service/bizservice/host/head/snd_host_head2.packet"/>
</packet>
2,DefaultHandler類是SAX2事件處理程式的預設基類。它實現了EntityResolver、DTDHandler、ContentHandler和ErrorHandler這四個介面。包含這四個介面的所有方法,所以我們在編寫事件處理程式時,可以不用直接實現這四個介面,而繼承該類,然後重寫我們需要的方法即可
我們SAX方法解析XML檔案時需要一個Handler類來提供解析的方法,裡面包含了重寫的繼承於DefaultHandler類的兩種方法,分別有開始和結束的方法
package socket.msg.pack;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import socket.msg.MsgField;
import socket.msg.MsgField.FillSide;
public class SAXParserHandler extends DefaultHandler {
int bookIndex = 0;
private ArrayList<String> nameList = new ArrayList<>();
private ArrayList<String> fillList = new ArrayList<>();
private ArrayList<String> dataList = new ArrayList<>();
public ArrayList<String> getNameList() {
return nameList;
}
public ArrayList<String> getFillList() {
return fillList;
}
public ArrayList<String> getDataList() {
return dataList;
}
// 用來標識解析開始和結束
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("SAX解析開始");
}
@Override
public void endDocument() throws SAXException {
super.startDocument();
System.out.println("SAX解析結束");
}
// 用來遍歷XML檔案的開始標籤
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
// 開始解析field節點的屬性
if (qName.equals("field")) {
bookIndex++;
int len = attributes.getLength();
System.out.println("*************************開始遍歷第" + (bookIndex) + "個Field*************************");
for (int i = 0; i < len; i++) {
if (attributes.getQName(i).equals("fieldName")) {
// field.setName(attributes.getValue(i));
nameList.add(attributes.getValue(i));
System.out.println(attributes.getQName(i) + ":" + attributes.getValue(i));
}
}
}
// 獲取field節點的所有子節點節點名
if (qName.equals("parameter")) {
if ("fillchar".equals(attributes.getValue("name"))||"偏移量".equals(attributes.getValue("name"))) {
fillList.add(attributes.getValue("value"));
}
if ("資料格式".equals(attributes.getValue("name"))) {
dataList.add(attributes.getValue("value"));
}
System.out.println(attributes.getValue("name") + ":" + attributes.getValue("value"));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
// 判斷針對是否已經遍歷結束
if (qName.equals("field")) {
System.out.println("===========================結束遍歷===========================");
}
}
}
3,Handler類準備好之後我們來編寫測試程式看一下解析結果:
package socket.msg.pack;
import java.io.IOException;
import java.util.ArrayList;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import socket.msg.pack.SAXParserHandler;
import socket.msg.MsgField;
import socket.msg.MsgField.FillSide;
public class TestSAX {
public static void main(String[] args) throws ParserConfigurationException, SAXException {
try {
// 是建立一個Handler處理類,去逐個分析每一個節點,並且是順序的
// 1.通過SAXParseFactory的靜態方法newInstance()來獲取SAXParseFactory的例項物件factory
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2.通過SAXParserFactory 靜態方法NewSAXParser()方法返回一個SAXParser類的例項;
SAXParserHandler handler = new SAXParserHandler();
// 3.重寫startElement、endElement、startDocument、endDocument方法
/*
* 可以將其儲存在繼承了DefaultHandler類的SAXParserHandler類中
* 然後建立SAXParserHandler類的物件並將其傳入SAXParser類的物件parser的parser方法;
*/
SAXParser parser = factory.newSAXParser();
String name=null;
int length = 0;
char fillChar=0;
FillSide fillSide = null;
parser.parse("D:\\request.packet", handler);
ArrayList<String> nameList = new ArrayList<>();
ArrayList<String> fillList = new ArrayList<>();
ArrayList<String> dataList = new ArrayList<>();
nameList = handler.getNameList();
fillList=handler.getFillList();
dataList=handler.getDataList();
for (int i = 0; i < nameList.size(); i++) {
name = nameList.get(i);
fillChar = fillList.get(i).charAt(0);
String s = dataList.get(i);
if (s.length() == 1) {
fillSide=getDirection(s);
} else {
String [] ss = s.split("\\(");
fillSide=getDirection(ss[0]);
length = Integer.parseInt(ss[1].substring(0, ss[1].length() - 1));
}
MsgField field = new MsgField(name, length, fillChar, fillSide);
System.out.println(field);
}
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static FillSide getDirection(String s) {
FillSide fillSide = null;
if ("X".equals(s)) {
fillSide = FillSide.RIGHT;
} else if ("9".equals(s)) {
fillSide = FillSide.LEFT;
}
return fillSide;
}
}
4,以下是解析結果
SAX解析開始
*************************開始遍歷第1個Field*************************
fieldName:PROVINCECODE
fillchar:0
len:2
dir:左邊
位置:-1
偏移量:0
資料格式:9(2)
===========================結束遍歷===========================
*************************開始遍歷第2個Field*************************
fieldName:OLDACCTNO
fillchar:
len:23
dir:右邊
位置:-1
偏移量:0
資料格式:X(23)
===========================結束遍歷===========================
*************************開始遍歷第3個Field*************************
fieldName:OFFSETPOS
位置:-1
偏移量:0
資料格式:9(3)
===========================結束遍歷===========================
*************************開始遍歷第4個Field*************************
fieldName:ACCTNO
位置:-1
偏移量:0
資料格式:9(17)
===========================結束遍歷===========================
*************************開始遍歷第5個Field*************************
fieldName:SUBACCTTYPE
位置:-1
偏移量:0
資料格式:X(4)
===========================結束遍歷===========================
*************************開始遍歷第6個Field*************************
fieldName:VOLUMENO
fillchar:0
len:3
dir:左邊
位置:-1
偏移量:0
資料格式:9(3)
===========================結束遍歷===========================
*************************開始遍歷第7個Field*************************
fieldName:SEQNO
fillchar:0
len:2
dir:左邊
位置:-1
偏移量:0
資料格式:9(2)
===========================結束遍歷===========================
*************************開始遍歷第8個Field*************************
fieldName:FunctionalOption
fillchar:
len:1
dir:右邊
位置:-1
偏移量:0
資料格式:X
===========================結束遍歷===========================
*************************開始遍歷第9個Field*************************
fieldName:FILLER
位置:-1
偏移量:0
資料格式:9
===========================結束遍歷===========================
*************************開始遍歷第10個Field*************************
fieldName:FILLER
位置:-1
偏移量:0
資料格式:9
===========================結束遍歷===========================
*************************開始遍歷第11個Field*************************
fieldName:FILLER
fillchar:
len:34
dir:右邊
位置:-1
偏移量:0
資料格式:X(34)
===========================結束遍歷===========================
*************************開始遍歷第12個Field*************************
fieldName:FILLER
fillchar:
len:2
dir:右邊
位置:-1
偏移量:0
資料格式:X(2)
===========================結束遍歷===========================
*************************開始遍歷第13個Field*************************
fieldName:OLDFLAG
fillchar:0
len:2
dir:左邊
位置:-1
偏移量:0
資料格式:9(2)
===========================結束遍歷===========================
編碼:GBK
SAX解析結束
MsgField [name=PROVINCECODE, length=2, fillChar=0, fillSide=LEFT]
MsgField [name=OLDACCTNO, length=23, fillChar=0, fillSide=RIGHT]
MsgField [name=OFFSETPOS, length=3, fillChar= , fillSide=LEFT]
MsgField [name=ACCTNO, length=17, fillChar=0, fillSide=LEFT]
MsgField [name=SUBACCTTYPE, length=4, fillChar=0, fillSide=RIGHT]
MsgField [name=VOLUMENO, length=3, fillChar=0, fillSide=LEFT]
MsgField [name=SEQNO, length=2, fillChar=0, fillSide=LEFT]
MsgField [name=FunctionalOption, length=2, fillChar=0, fillSide=RIGHT]
MsgField [name=FILLER, length=2, fillChar=0, fillSide=LEFT]
MsgField [name=FILLER, length=2, fillChar=0, fillSide=LEFT]
MsgField [name=FILLER, length=34, fillChar=0, fillSide=RIGHT]
MsgField [name=FILLER, length=2, fillChar= , fillSide=RIGHT]
MsgField [name=OLDFLAG, length=2, fillChar=0, fillSide=LEFT]
相關推薦
SAX方式解析XML檔案的方法分析,並取特定欄位生成物件
SAX(Simple API for XML)SAX的工作原理簡單地說就是對文件進行順序掃描,當掃描到文件(document)開始與結束、元素(element)開始與結束、文件(document)結束等地方時通知事件處理方法,由事件處理函式做相應動作,然後繼續同樣的掃描,
XML解析之SAX方式解析xml檔案
SAX解析方式會逐行地去掃描XML文件,當遇到標籤時會觸發解析處理器,採用事件處理的方式解析XML (Simple API for XML) ,不是官方標準,但它是 XML 社群事實上的標準,幾乎所有的 XML 解析器都支援它。優點是:在讀取文件的同時即可對XM
java--通過sax方式解析xml檔案的簡單例項
1.重寫的繼承自DefaultHandler的方法,部分程式碼如下: @Override public void startElement(String uri, String localName, String qName, Attributes attribut
網絡相關系列之四:數據解析之SAX方式解析XML數據
request nco nodename 新建 作用 call 其他 auto 文件內容 一、XML和Json數據的引入: 通常情況下。每一個須要訪問網絡的應用程序都會有一個自己的server。我們能夠向server提交數據,也能夠從server獲取數據。
XML —— SAX方式解析XML
1. SAX 方式解析 XML 原理 SAX 的工作原理簡單地說就是對文件進行順序掃描,當掃描到文件(document)開始與結束、元素(element) 開始與結束等地方時通知事件處理函式,由事件處理函式做相應動作,然後繼續同 樣的掃描,直至文件結束。 優點:相對於DOM方式消耗資源比較少,適
SAX方式解析XML
SAX方式解析XML原理 SAX的工作方式簡單地說就是對文件進行順序掃描,當掃描到文件(document)開始與結束,元素(Element)開始與結束、文件(document)結束等地方時通知事件處理函式,由事件處理函式做相應的動作,然後繼續同樣的掃描,直至文件結束。 優點:消耗資源比較少;適合大檔案解析
Java用String 擷取方式解析xml檔案、處理大xml檔案
對於小資料返回值直接可採用Document、element的解析方式即可獲得xml節點值。 但對於返回值大於10M的資料,Document解析就顯得吃力甚至出現程式中斷情況。針對返回資料大的xml可採取Java String 分割擷取方式處理。 如下報文返回的是銀行資訊,程式需要獲得Ba
Java 應用DOM方式解析XML檔案
引入 java為啥需要解析XML的方法? xml的優勢: 它可以用來標記資料、定義資料型別,是一種允許使用者對自己的標記語言進行定義的源語言。 它非常適合全球資訊網傳輸,提供統一的方法來描述和交換獨立於應用程式或供應商的結構化資料。是Internet環境中
使用SAX方式解析XML
一、建立XML檔案 目錄結構: 二、新建一個帶有main方法的類(SAXTest.java) public class SAXTest { public static void main(String[] args) {
Mybatis學習總結三之簡化sql對映xml檔案中的引用及解決欄位名與實體類屬性名不相同的衝突
一、為實體類定義別名,簡化sql對映xml檔案中的引用 我們在sql對映xml檔案中的引用實體類時,需要寫上實體類的全類名(包名+類名),如下:parameterType="com.aiit.pojo.User"這裡寫的實體類User的全類名com.aiit.pojo.User, <i
java中解析xml檔案的五種常見方法:DOM4J,dom,pull,SAX,Jdom
package com.zhidi.dom4jtest; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import or
Sax 解析xml檔案時, 資料資訊不完整問題解決方法
使用Sax對xml檔案進行解析時,Sax每次只讀入2k資料,當xml檔案大於2k時,資料資訊可能回出現不完成的情況. 此時,我們只需要使用StringBuffer對資訊進行組合. 同時,在使用完StringBuffer之後,需要對StringBuffer進行清空操作.
使用pull方式和sax方式對xml文件進行解析
tostring 需要 nts tag .com version thp response pri 這是我自己設置的xml文件 用一下方式獲取它的內容 try{ OkHttpClient client = new OkHttpClient(); Request
dom4j解析xml 檔案 並對其操作
程式碼例項 package cn.test.dom4jtest; import java.io.FileOutputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHel
Java解析xml檔案的方式
import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; impo
Java中使用DOM方法解析XML檔案
Java中使用DOM方法解析XML檔案 1、簡介 XML現在已經成為一種通用的資料交換格式,平臺的無關性使得很多場合都需要用到XML,本部落格將介紹用DOM方法解析XML檔案的方法,DOM解析是將XML檔案全部載入到記憶體,組裝成一顆DOM樹,然後通過節點以及節點之間的關係來解析XM
poi用jdom解析xml檔案方式定製Excel模板
java程式碼 package com.td.store.utils; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java
SAX解析XML檔案-遍歷
@Test public void saxXml() { long startTime = System.currentTimeMillis(); try { // step 1: 獲得SAX解析器工廠例
Java解析XML檔案的常用方法介紹
1 import java.io.IOException; 2 3 import javax.xml.parsers.DocumentBuilder; 4 import javax.xml.parsers.DocumentBuilderFactory; 5 import javax.x
Java眼中的XML---檔案讀取(二)SAX解析XML檔案
目錄 (一)SAX解析是什麼? (二)SAX解析和DOM解析的區別? (三)SAX方法解析XML的步驟 (四)SAX解析Java程式碼實現 (一)SAX解析是什麼? SAX(simple API for XML)是一種XML解析的