Кратко поговорим о первых трёх способах:
Метод DOM : лично я понимаю, что XmlDocument, аналогичный .net, неэффективен при парсинге, занимает память и не подходит для парсинга больших XML;
Метод SAX : синтаксический анализ на основе событий. При анализе определенной части xml будет вызвано определенное событие. Вы можете определить, что делать, когда событие срабатывает, в специальном классе синтаксического анализа. Лично я считаю, что это очень альтернативный вариант. кстати, интересно, есть ли аналогичный метод в системе .Net?
Метод StAX : лично я понимаю, что он похож на метод XmlReader .net, который очень эффективен, занимает меньше памяти и подходит для анализа больших XML;
Однако метод SAX использовался и раньше. В этой статье в основном рассматривается JAXB. Здесь размещен только основной код:
Скопируйте код кода следующим образом:
импортировать java.util.ArrayList;
импортировать java.util.List;
импортировать org.xml.sax.Attributes;
импортировать org.xml.sax.SAXException;
импортировать org.xml.sax.helpers.DefaultHandler;
общественный класс ConfigParser расширяет DefaultHandler {
частная строка currentConfigSection;
общественный SysConfigItem sysConfig;
общественный список <InterfaceConfigItem> интерфейсConfigList;
общедоступный список <FtpConfigItem> ftpConfigList;
общедоступный список адаптерConfigList;
public void startDocument() выдает исключение SAXException {
sysConfig = новый SysConfigItem ();
InterfaceConfigList = новый ArrayList<InterfaceConfigItem>();
ftpConfigList = новый ArrayList<FtpConfigItem>();
адаптерConfigList = новый ArrayList<AdapterConfigItem>();
}
public void endDocument() выдает SAXException {
}
public void startElement (String uri, String localName, String qName, атрибуты Attributes) выдает исключение SAXException {
if (qName.equalsIgnoreCase("Item") && атрибуты.getLength() > 0) {
if (currentConfigSection.equalsIgnoreCase("SysConfigItem")) {
sysConfig = новый SysConfigItem (атрибуты);
} else if (currentConfigSection.equalsIgnoreCase("InterfaceConfigItems")) {
InterfaceConfigList.add(новый InterfaceConfigItem(атрибуты));
} else if (currentConfigSection.equalsIgnoreCase("FtpConfigItems")) {
ftpConfigList.add(новый FtpConfigItem(атрибуты));
} else if (currentConfigSection.equalsIgnoreCase("AdapterConfigItems")) {
адаптерConfigList.add(новый AdaptorConfigItem(атрибуты));
}
} еще {
currentConfigSection = qName;
}
}
public void endElement(String uri, String localName, String qName) выдает исключение SAXException {
}
общественные недействительные символы (char ch[], int start, int length) выбрасывает SAXException {
}
}
Скопируйте код кода следующим образом:
импортировать java.lang.reflect.Field;
импортировать java.text.DateFormat;
импортировать java.text.ParseException;
импортировать java.text.SimpleDateFormat;
импортировать java.util.Date;
импортировать org.xml.sax.Attributes;
общественный класс ConfigItemBase {
частный статический DateFormat dateFormat = new SimpleDateFormat("гггг-ММ-дд ЧЧ:мм:сс");
общественный ConfigItemBase () {
}
/**
* В настоящее время поддерживаются только несколько распространенных типов. Если вам нужна поддержка других типов, измените код здесь.
*
* Атрибуты @param
*/
public ConfigItemBase (атрибуты атрибутов) {
Class<?> cls = this.getClass();
Field[] поля = cls.getDeclaredFields();
for (Поле поля: поля) {
Строка fieldType = field.getType().getSimpleName();
for (int i = 0; i <attributes.getLength(); i++) {
if (attributes.getQName(i).equalsIgnoreCase(field.getName())) {
поле.setAccessible(истина);
пытаться {
if (fieldType.equalsIgnoreCase("String")) {
field.set(this, атрибуты.getValue(attributes.getQName(i)));
} else if (fieldType.equalsIgnoreCase("Integer")) {
field.set(this, Integer.valueOf(attributes.getValue(attributes.getQName(i))));
} else if (fieldType.equalsIgnoreCase("Double")) {
field.set(this, Double.valueOf(attributes.getValue(attributes.getQName(i))));
} else if (fieldType.equalsIgnoreCase("Дата")) {
field.set(this, GetDate(attributes.getValue(attributes.getQName(i))));
} еще {
System.out.println("Внимание: Поле Unhandler(" + field.getName() + "-" + fieldType + ")");
}
} catch (IllegalArgumentException e) {
е.printStackTrace();
} catch (IllegalAccessException e) {
е.printStackTrace();
}
перерыв;
}
}
}
}
публичная строка toString() {
Строковый результат = "";
Class<?> cls = this.getClass();
Строка classNameString = cls.getName();
result += classNameString.substring(classNameString.lastIndexOf('.') + 1, classNameString.length()) + ":";
Field[] поля = cls.getDeclaredFields();
for (Поле поля: поля) {
пытаться {
result += field.getName() + "=" + field.get(this) + ";";
} catch (IllegalArgumentException e) {
е.printStackTrace();
} catch (IllegalAccessException e) {
е.printStackTrace();
}
}
вернуть результат;
}
/**
* Атрибуты типа времени обработки (требования к формату времени: гггг-ММ-дд чч:мм:сс)
*
* @param dateString
* @возвращаться
*/
частная статическая дата GetDate (String dateString) {
Дата дата = ноль;
пытаться {
дата = dateFormat.parse(dateString);
} catch (ParseException e) {
е.printStackTrace();
}
дата возвращения;
}
}
Далее основное внимание уделяется наиболее удобному: JAXB (архитектура Java для привязки XML).
Здесь мы используем в качестве примера более сложный мобильный XML-интерфейс BatchSyncOrderRelationReq (я чувствую, что всех, кто может это понять, в принципе достаточно), формат сообщения следующий (содержимое CDATA в SvcCont — это тело сообщения, что отвратительно):
Скопируйте код кода следующим образом:
<?xml version="1.0"coding="UTF-8" Standalone="да" ?>
<ИнтерБОСС>
<Версия>0100</Версия>
<TestFlag>0</TestFlag>
<ТипБИП>
<BIPCode>BIP2B518</BIPCode>
<ActivityCode>T2101518</ActivityCode>
<ActionCode>0</ActionCode>
</BIPТип>
<Информация о маршрутизации>
<OrigDomain>БОСС</OrigDomain>
<RouteType>routeType</RouteType>
<Маршрутизация>
<HomeDomain>XXXX</HomeDomain>
<RouteValue>routeValue</RouteValue>
</Маршрутизация>
</Информация о маршрутизации>
<ТрансИнфо>
<SessionID>2013041017222313925676</SessionID>
<TransIDO>2013041017222313925676</TransIDO>
<TransIDOTime>20130410172223</TransIDOTime>
<TransIDH></TransIDH>
<TransIDHTime></TransIDHTime>
</ТрансИнфо>
<SNReserve>
<TransIDC></TransIDC>
<ConvID></ConvID>
<CutOffDay></CutOffDay>
<OSNTime></OSNTime>
<ОСНДУНС></ОСНДУНС>
<HSNDUNS></HSNDUNS>
<MsgSender></MsgSender>
<MsgReceiver></MsgReceiver>
<Приоритет></Приоритет>
<ServiceLevel></ServiceLevel>
<SvcContType></SvcContType>
</SNReserve>
<Ответ>
<RspType>rspType</RspType>
<RspCode>rspCode</RspCode>
<RspDesc>rspDesc</RspDesc>
</ответ>
<SvcCont><![CDATA[<?xml version="1.0"coding="UTF-8" Standalone="да"?>
<batchSyncOrderRelationReq>
<msgTransactionID>210001BIP2B518130410172223651627</msgTransactionID>
<reqNum>2</reqNum>
<reqBody>
<oprNumb>210001BIP2B518130410172224341871</oprNumb>
<информация о подписке>
<oprTime>oprTime1</oprTime>
<actionID>actionId1</actionID>
<бренд>бренд1</бренд>
<effTime>effTime1</effTime>
<expireTime>expireTime1</expireTime>
<feeUser_ID>feeUserId1</feeUser_ID>
<destUser_ID>destUserId1</destUser_ID>
<actionReasonID>actionId1</actionReasonID>
<servType>servType1</servType>
<subServType>subServType1</subServType>
<SPID>spID1</SPID>
<SPServID>spServId1</SPServID>
<accessMode>accessMode1</accessMode>
<сервПарамИнфо>
<para_num>0</para_num>
<пара_информация>
<имя_параметра></имя_параметра>
<para_value></para_value>
</para_info>
</servParamInfo>
<feeType>feeType1</feeType>
</подпискаИнформация>
</reqBody>
<reqBody>
<oprNumb>210001BIP2B518130410172224420909</oprNumb>
<информация о подписке>
<oprTime>oprTime2</oprTime>
<actionID>actionId2</actionID>
<бренд>бренд2</бренд>
<effTime>effTime2</effTime>
<expireTime>expireTime2</expireTime>
<feeUser_ID>feeUserId2</feeUser_ID>
<destUser_ID>destUserId2</destUser_ID>
<actionReasonID>actionId2</actionReasonID>
<servType>servType2</servType>
<subServType>subServType2</subServType>
<SPID>spID2</SPID>
<SPServID>spServId2</SPServID>
<accessMode>accessMode2</accessMode>
<сервПарамИнфо>
<para_num>0</para_num>
<пара_информация>
<имя_параметра></имя_параметра>
<para_value></para_value>
</para_info>
</servParamInfo>
<feeType>feeType2</feeType>
</подпискаИнформация>
</reqBody>
</batchSyncOrderRelationReq>]]></SvcCont>
</ИнтерБОСС>
Код декодирования следующий:
Скопируйте код кода следующим образом:
@XmlRootElement(name = "batchSyncOrderRelationReq")
@XmlAccessorType(XmlAccessType.ПОЛЕ)
публичный класс BatchSyncOrderRelationReq расширяет BossMessage<BatchSyncOrderRelationReq> {
@XmlElement(name = "msgTransactionID")
частная строка msgTransactionId = "";
@XmlElement(name = "reqNum")
частная строка reqNum = "";
@XmlElement(name = "reqBody")
частный список <BatchSyncOrderRelationReqBody> reqBodyList;
общественный BatchSyncOrderRelationReq () {
}
публичная строка getMsgTransactionId() {
вернуть this.msgTransactionId;
}
общественная недействительность setMsgTransactionId (String msgTransactionId) {
this.msgTransactionId = msgTransactionId;
}
публичная строка getReqNum() {
вернуть this.reqNum;
}
общественный недействительный setReqNum (String reqNum) {
this.reqNum = reqNum;
}
публичный список<BatchSyncOrderRelationReqBody> getReqBodyList() {
вернуть this.reqBodyList;
}
public void setReqBodyList(List<BatchSyncOrderRelationReqBody> reqBodyList) {
this.reqBodyList = reqBodyList;
}
@Override
public BatchSyncOrderRelationReq Deserialized (String interBossXmlContent) выдает BusinessException {
пытаться {
// десериализуем для головы
JAXBContext jaxbCxt4Head = JAXBContext.newInstance(MessageHead.class);
Unmarshaller unmarshaller4Head = jaxbCxt4Head.createUnmarshaller();
MessageHead head = (MessageHead) unmarshaller4Head.unmarshal (новый StringReader (interBossXmlContent));
// десериализация для тела SyncOrderRelationReq
JAXBContext jaxbCxt4Body = JAXBContext.newInstance(BatchSyncOrderRelationReq.class);
Unmarshaller unmarshaller4Body = jaxbCxt4Body.createUnmarshaller();
BatchSyncOrderRelationReqatchSyncOrderRelationReq = (BatchSyncOrderRelationReq) unmarshaller4Body.unmarshal(new StringReader(head.getSvcCont().trim()));
BatchSyncOrderRelationReq.setHead(head);
вернуть пакетSyncOrderRelationReq;
} catch (JAXBException e) {
throw new BusinessException("Ошибка SyncOrderRelationReq.Deserialized()!(" + interBossXmlContent + ")", e);
}
}
}
@XmlAccessorType(XmlAccessType.ПОЛЕ)
Скопируйте код кода следующим образом:
общественный класс BatchSyncOrderRelationReqBody {
@XmlElement(name = "oprNumb")
частная строка oprNumb = "";
@XmlElement(name = "Информация о подписке")
частная SubscriptionInfo subscribeInfo;
общественный BatchSyncOrderRelationReqBody () {
}
public BatchSyncOrderRelationReqBody (String oprNumb, SubscriptionInfo subscribeInfo) {
this.oprNumb = oprNumb;
this.subscriptionInfo = подпискаInfo;
}
публичная строка getOprNumb() {
вернуть this.oprNumb;
}
общественная недействительность setOprNumb (String oprNumb) {
this.oprNumb = oprNumb;
}
общественная информация о подписке getSubscriptionInfo () {
вернуть this.subscriptionInfo;
}
public void setSubscriptionInfo (SubscriptionInfo subscribeInfo) {
this.subscriptionInfo = подпискаInfo;
}
}
@XmlAccessorType(XmlAccessType.ПОЛЕ)
Скопируйте код кода следующим образом:
общественный класс SubscriptionInfo {
@XmlElement(name = "oprTime")
частная строка oprTime = "";
@XmlElement(name = «ID действия»)
частная строка actionId = "";
@XmlElement(name = "торговая марка")
частный бренд String = "";
@XmlElement(name = "effTime")
частная строка effTime = "";
@XmlElement(name = "expireTime")
частная строка expireTime = "";
@XmlElement(name = "feeUser_ID")
частная строка FeUserId = "";
@XmlElement(name = "destUser_ID")
частная строка destUserId = "";
@XmlElement(name = "actionReasonID")
частная строка actionReasonId = "";
@XmlElement(name = "servType")
частная строка servType = "";
@XmlElement(name = "subServType")
частная строка subServType = "";
@XmlElement(name = "SPID")
частная строка spId = "";
@XmlElement(name = "SPServID")
частная строка spServId = "";
@XmlElement(name = "accessMode")
частная строка accessMode = "";
@XmlElement(name = "feeType")
частная строка FeType = "";
общественная информация о подписке () {
}
общедоступная информация о подписке(
Строка oprTime,
Строковый идентификатор действия,
Струнная марка,
Строка effTime,
Строка expireTime,
Строковая платаUserId,
Строка destUserId,
Строка actionReasonId,
Строковый типсерва,
Строка subServType,
Строковый идентификатор,
Строка spServId,
Строковый режим доступа,
Строка FeeType) {
this.oprTime = oprTime;
this.actionId = actionId;
this.brand = бренд;
this.effTime = effTime;
this.expireTime = expireTime;
this.feeUserId = FeeUserId;
this.destUserId = destUserId;
this.actionReasonId = actionReasonId;
this.servType = servType;
this.subServType = subServType;
this.spId = spId;
this.spServId = spServId;
this.accessMode = accessMode;
this.feeType = тип комиссии;
}
публичная строка getOprTime() {
вернуть this.oprTime;
}
public void setOprTime (String oprTime) {
this.oprTime = oprTime;
}
публичная строка getActionId() {
вернуть this.actionId;
}
общественный недействительный setActionId (String actionId) {
this.actionId = actionId;
}
публичная строка getBrand() {
вернуть this.brand;
}
public void setBrand(String Brand) {
this.brand = бренд;
}
общественная строка getEffTime() {
вернуть this.effTime;
}
public void setEffTime (String effTime) {
this.effTime = effTime;
}
публичная строка getExpireTime() {
верните это.expireTime;
}
public void setExpireTime (String expireTime) {
this.expireTime = expireTime;
}
публичная строка getFeeUserId() {
верните this.feeUserId;
}
public void setFeeUserId (StringfeUserId) {
this.feeUserId = FeeUserId;
}
общественная строка getDestUserId() {
верните this.destUserId;
}
общественный недействительный setDestUserId (String destUserId) {
this.destUserId = destUserId;
}
публичная строка getActionReasonId() {
верните this.actionReasonId;
}
public void setActionReasonId (String actionReasonId) {
this.actionReasonId = actionReasonId;
}
общественная строка getServType() {
вернуть этот.servType;
}
общественный недействительный setServType (String servType) {
this.servType = servType;
}
общественная строка getSubServType() {
верните этот.subServType;
}
общественный недействительный setSubServType (String subServType) {
this.subServType = subServType;
}
публичная строка getSpId() {
вернуть этот.spId;
}
общественный недействительный setSpId (String spId) {
this.spId = spId;
}
публичная строка getSpServId() {
вернуть this.spServId;
}
общественный недействительный setSpServId (String spServId) {
this.spServId = spServId;
}
публичная строка getAccessMode() {
верните этот.accessMode;
}
public void setAccessMode (String accessMode) {
this.accessMode = accessMode;
}
публичная строка getFeeType() {
вернуть this.feeType;
}
public void setFeeType (String FeeType) {
this.feeType = тип комиссии;
}
}