|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
windows系统样,他们做了什么事或者留了一些后门程序,谁都不知道,二,java开发是跨平台,任何系统上都可以运行,对于保密型系统和大型系统开发这是必要的xml现在仿佛任何的软件开辟都离不开XML手艺撑持,在图形图象、数据库、加密平安、软件工程、收集教导、电子商务、语音手艺上都有XML发挥拳脚的中央,XML使用年夜潮已光降。
XML事情小组开创会员C.M.Sperberg-McQueen以为:“XML最年夜的影响在于XML软件大批衰亡:XML分析器、XML程序言语库、XSLT处置器、XSLFO处置器、数据库承受XML―不但云云,另有收集扫瞄器也承受XML。”也正由于云云,IBM、微软、SUN、惠普、Oracle等至公司纷繁进进这个市场。
在学会了XGen等对象绑定工具后,信任人人已是伎痒,但愿立即用XGen来实战一下,体验一下XML对象绑定的上风。上面就先容一下我常常用到的XML使用。
1.XML设置文件
每一个体系大概都必要或年夜或小的设置文件,经由过程设置文件来初始化体系的参数,优点不必具体先容了。一样平常设置文件的格局有以下种:
1.window体系中ini格局文件和Java言语中利用的Properties文件
2.XML格局的文件
3.其他格局文件
第一品种型的设置文件是纯文本文件,基础接纳“key=value”的格局来纪录各类参数,便于手工誊写和浏览。
基于XMLSchema的XML文件易于浏览,而且能十分好的显现各个元素之间的条理干系和束缚干系。相对ini文件格局利用xml格局的设置文件有以下长处:
1.1.设置具有条理性
1.2.取值无效性反省
1.3.撑持链表,列举,庞大数据范例
1.4.设置文件能够嵌套
1.5.分离XMLSpy等XML编纂工具编纂设置文件非常便利
1.6.存在大批第三方的XML对象绑定工具,而且功效壮大、开辟便利。如Java言语版的XGen、JAXB,C++版工具XBind
如今就使入手下手理论利用XML作为程序利用的设置文件吧。
1.1.计划XSD文件(XMLSchema)
XGen必要编译的是XSD文件,XSD文件是用来形貌指定范例的XML文件的纲目文件,是个纯文本文件。经由过程本文编纂工具就能够手工创立、编纂XSD文件,可是经由过程一些XML编纂工具能够事半功倍的完成XSD编写事情。我也用过一些XML编纂工具,可是只要XMLSPY的功效最壮大,而且利用十分便利。
XMLSpy的一些特征:
l在编纂XML、XSD等文件时具有提醒输出功效,能够十分便利的选择。
l同时具有XML文件正当性校验功效,能够判别Element值的取值是不是切合schema的界说。
l撑持DTD和XSD互转
l供应XSD的样例XML实例文件功效
l一样撑持java,c++,c#的xml绑定,能够天生Java,c++和C#代码,不要太壮大哦!
经由过程XMLSpy编写AlertServer.xsd文件
<?xmlversion="1.0"?>
<xsd:schematargetNamespace="urn:com:lianchuang:smartsecurer:alert:config:configfile.xsd"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns="urn:com:lianchuang:smartsecurer:alert:config:configfile.xsd"elementFormDefault="qualified"attributeFormDefault="unqualified">
<xsd:elementname="Config"type="ConifgType"/>
<xsd:complexTypename="ConifgType">
<xsd:sequence>
<xsd:elementref="Globe"/>
</xsd:sequence>
</xsd:complexType>
<xsd:elementname="Globe"type="GlobeType"/>
<xsd:complexTypename="GlobeType">
<xsd:sequence>
<xsd:elementref="AlertServer"/>
<xsd:elementref="VOManager"maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:elementname="AlertServer"type="AlertServerType"/>
<xsd:complexTypename="AlertServerType">
<xsd:sequence>
<xsd:elementname="ID"type="xsd:int"/>
<xsd:elementname="Address"type="xsd:string"default="127.0.0.1"minOccurs="0"/>
<xsd:elementname="Port"type="xsd:int"default="1099"minOccurs="0"/>
<xsd:elementname="AlertServerName"type="xsd:string"minOccurs="0"/>
<xsd:elementname="RegisterInterval"type="xsd:int"default="1000"minOccurs="0"/>
<xsd:elementname="CacheSize"type="xsd:int"default="10000"minOccurs="0"/>
<xsd:elementname="DeliverThreadNum"type="xsd:int"default="2"minOccurs="0"/>
<xsd:elementref="DBOperMode"default="Default"minOccurs="0"/>
<xsd:elementname="BatchDBInsertSize"type="xsd:int"default="1000"minOccurs="0"/>
<xsd:elementname="StatisticsInterval"type="xsd:int"default="1000"minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:elementname="VOManager"type="VOManagerType"/>
<xsd:complexTypename="VOManagerType">
<xsd:sequence>
<xsd:elementname="Address"type="xsd:string"/>
<xsd:elementname="Port"type="xsd:int"default="1099"minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:elementname="DBOperMode">
<xsd:simpleType>
<xsd:restrictionbase="xsd:string">
<xsd:enumerationvalue="Default"/>
<xsd:enumerationvalue="Native"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:schema>
注重<xsd:schema>设置
elementFormDefault="qualified"attributeFormDefault="unqualified"属性
,不然在unmarshal(InputStream,valid)办法挪用中会有非常。如许设置暗示限定部分元素和属性,即对每一个部分的元素都要设定前缀。
当将elementFormDefault设置为qualified时,它暗示在该语法的实例中,必需利用前缀或经由过程设置{默许定名空间}来显式限制一切元素。unqualified设置意味着只要全局声明的元素才必需被显式限制,而部分声明的元素不得被限制。在此情况下,限制一个部分声明是毛病的。一样,将attributeFormDefault设置为qualified时,必需利用前缀显式限制实例文档中的一切属性。
1.2.创立Java对象
进进xgen安装目次,为了费事将AlertServer.xsd文件拷贝到该目次下。实行以下剧本:
xgenAlertServer.xsd
在以后目次下,会依照urn路径天生comlianchuangsmartsecureralertconfigconfigfile_xsd目次,而且新创立的class文件就保留在该目次下。若在XSD中界说了自界说庞大范例数据,则会在configfile_xsd
目次下创立 ype目次,并把相干的JavaClass放在该目次下。
1.3.编写代码
关于界说XSD文档,每一个庞大范例的ElementA,会有ElementA和ElementATypeComplexType类来作为该Java类的映照,经由过程getElementATypeComplexType()办法间接能够猎取猎取ElementA的庞大对象范例的援用。
如在XSD文件中的Globe,能够经由过程XXX.getConifgTypeComplexType().getGlobe()来猎取该Java对象,经由过程config.getConifgTypeComplexType().getGlobe().getGlobeTypeComplexType()来猎取实践的该范例的对象。
关于一些基础范例Element。XGen界说了一些X开首的类与之对应,如int,用XInt暗示。能够经由过程newXInt(inti)来机关XInt对象。
//上面是读取指定的设置文件,前往Java对象的代码
publicstaticsynchronizedConfiggetConfig(StringfileName)throws
FileNotFoundException
{
//创立InputStream对象
Filefile=newFile(fileName);
FileInputStreamins=newFileInputStream(file);
ChainedEntityResolverer=newChainedEntityResolver();
Unmarshallerun=newUnmarshaller(er);
GlobalElementge=null;
try
{
ge=un.unmarshal(ins,false);//注重,因为自己对XML和XSD也是一孔之见,unmarshal的办法实验了一遍,只要利用这个办法,才能够一般转化xml文件的对象。不晓得为何…
if(ge!=null&&geinstanceofConfig)
configInstance=(Config)ge;
}
catch(ValidationExceptionex)
{
m_log.error(ex);
}
catch(MarshalExceptionex)
{
m_log.error(ex);
}
catch(IOExceptionex)
{
m_log.error(ex);
}
returnconfigInstance;
}
//上面是打印对象各个属性参数的样例代码
publicstaticvoidprintConfig(Configconfig)
{
if(config==null)
return;
m_log.debug("================AlertServerParameters==================");
m_log.debug("ID="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getAlertServer().
getAlertServerTypeComplexType().getID());
m_log.debug("Address="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().
getAlertServer().getAlertServerTypeComplexType().getAddress());
m_log.debug("Port="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().
getAlertServer().getAlertServerTypeComplexType().getPort());
m_log.debug("AlertServerName="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getAlertServer().
getAlertServerTypeComplexType().getAlertServerName());
m_log.debug("RegisterInterval="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getAlertServer().
getAlertServerTypeComplexType().getRegisterInterval());
m_log.debug("DeliverThreadNum="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().
getAlertServer().getAlertServerTypeComplexType().
getDeliverThreadNum());
m_log.debug("CacheSize="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getAlertServer().
getAlertServerTypeComplexType().getCacheSize());
m_log.debug("BatchDBInsertSize="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getAlertServer().
getAlertServerTypeComplexType().getBatchDBInsertSize());
m_log.debug("=================VOManagerParameters==================");
for(inti=0;
i<
config.getConifgTypeComplexType().getGlobe().getGlobeTypeComplexType().
getVOManagerCount();
++i)
{
m_log.debug("VOMangerAddress="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getVOManager()[i].
getVOManagerTypeComplexType().getAddress());
m_log.debug("VOMangerPort="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getVOManager()[i].
getVOManagerTypeComplexType().getPort());
}
}
2.使用XML格局的动静通讯
编写自界说Socket通讯程序时,都必要本人界说一套通讯协定的标准,特别是异构的体系。我们可使用xml文档作为通讯协定,分离XML相干的对象绑定工具来将XML格局的报文转换为Java、C++等言语的对象。
上面以Java言语分离XGen利用样例形貌通讯的流程。
2.1.通讯流程
l发送XML对象
经由过程程序创立相干的对象,并赋值。经由过程unmarshal办法转化为StringWriter对象,利用StringWriter的getBuffer().toString()办法前往转化好的字符串。最初,使用socket发送该String。
l吸收XML对象
吸收到XML文档后,marshal到Java对象便可。
2.2.详细手艺
l通讯中加密
因为经由过程XML文档举行通讯,数据包是明文的文本,关于一些敏感数据必要举行得当的加密。如间接对XMLw文档长进行DES然后传送,大概依据情形接纳更平安的加密体例。
l发送XML文档
//UDPSocket
DatagramSocketdiscoverySocket=null;
//发送的数据包
DatagramPacketdgp=null;
//将XML对象转化StringWriter对象,即转化为字符串对象
StringWritersw=newStringWriter();
//XML绑定对象
requestreq=null;
//必要发送的字符数组
byte[]sendBytes=null;
……
……
try
{
//创立XML文档对象
req=XMLObjAnalysis.makeRequset(m_agentDisc.m_configFileName,
getDiscoverRespSeqNo(),
XMLObjAnalysis.DISCOVERY_REQUEST);
sw.getBuffer().setLength(0);
//将哀求对象序列化为xml字符串
req.getRequestTypeComplexType().setRequestAgentIp(newXString(
agentKey.getRequestIp()));
req.marshal(sw);
//将XML文档经由过程DES加密
sendBytes=getDESBytes(sw.getBuffer().toString().
getBytes(),true);
if(sendBytes!=null)
{
dgp=newDatagramPacket(sendBytes,sendBytes.length);
dgp.setAddress(ia);
dgp.setPort(agentKey.getPort());
m_log.debug("Senddiscoverypdu:"+agentKey.getRequestIp()+
":"+
agentKey.getPort()+",size="+
sendBytes.length);
//m_log.debug(newString(sw.getBuffer()));
discoverySocket.send(dgp);
}
}
catch(Exceptionex4)
{
m_log.error(ex4);
}
l吸收XML文档
inGram=
newDatagramPacket
(inBuffer,inBuffer.length);
try
{
for(;;)
{
try
{
inSock.receive(inGram);
}
catch(IOExceptionex)
{
m_log.error
("ERRORreadinginputsocket:"
+ex.getMessage());
//break;
}
catch(Exceptionex)
{
ex.printStackTrace();
try
{
Thread.sleep(100);
}
catch(InterruptedExceptionex2)
{
}
//return;
continue;
}
recvBytes=newbyte[inGram.getLength()];
System.arraycopy(inGram.getData(),0,recvBytes,0,inGram.getLength());
dealAgentMessage(recvBytes,hostName);
}
}
finally
{
if(inSock!=null)
inSock.close();
}
privatevoiddealAgentMessage(finalbyte[]origRecvBytes)
{
BasicInforesp=null;
//解密XML文档
byte[]recvBytes=m_agentDisc.getDESBytes(origRecvBytes,false);
//将encoding标签改成gb2312,如许能够剖析出元素中的中文,不然,没法准确转化为中文
Stringorig=newString(recvBytes);
orig=orig.replaceAll("encoding="UTF-8"","encoding="gb2312"");
//将字符串转化为ByteArrayInputStream
ByteArrayInputStreambais=newByteArrayInputStream(orig.trim().
getBytes());
try
{
//将XML文档转换为对象
resp=XMLObjAnalysis.getResponseFromXMLStream(bais);
}
catch(Exceptionex1)
{
m_log.error(ex1);
}
StringrequestAgentIp=resp.getBasicInfoTypeComplexType().
getRequestAgentIp().get();
if(resp==null)
{
m_log.error("Decodereponseerror.Ip="+requestAgentIp);
return;
}
//判别是不是是代办署理主动发明的呼应数据
if(resp.getBasicInfoTypeComplexType().getResponse().
getResponseChoiceComplexType().getAutoDiscoveryAsChoice()!=null)
{
……
}
elseif(resp.getBasicInfoTypeComplexType().getResponse().
getResponseChoiceComplexType().getHealthCheckAsChoice()!=null)
{
……
}
}
你说是sun公司对她研究的透还是微软?针对自己工具开发的.net性能上肯定会站上风的。 |
|