请教各位大侠一个问题,先谢谢了。
我想用XML来实现这样一个功能:B通过检查A发送来的XML文档的<METHOD>元素的内容来识别A的请求想干什么,并提取相应的数据。
举个例子:
John收到一个XML文档,John通过提取元素<UserID>的内容得知这是Mike发来的请求,然后检查文档中元素<METHOD>的内容得知Mike想修改口令,然后John再从元素<OLDPASSWORD>中取出Mike的旧口令,判断文档中的旧口令是否正确。如果口令正确,那么John接着从元素<NEWPASSWORD>中提取出Mike的新口令并保存起来。
同样,John如果收到一个XML文档,就可以处理Tom的登录请求。
例子说完了,不知道是否能让各位大侠明白小弟的意思。
我现在的问题是,由于对XML不太了解,有下列难题:
1,我不会用一个schema来定义上述XML文档的结构?请教各位大侠如何用schema或DTD来定义这些XML文档,是不是需要多个schema或是DTD
2,如果大侠您想借助XML实现我描述的功能,您会怎么设计XML文档结构。
最后要说的是,我对XML了解的很少,在提问中有什么胡言乱语,请各位大侠见谅。
XML文档1
<REQUEST> //表明这是一个请求
//客户信息
<USER>
<UserID>Mike</UserID> //UserID:用户代号
</USER>
//消息参数区
<METHOD>ModifyPassword</METHOD>
<PARAMS>
<OLDPASSWORD>1111</OLDPASSWORD > // 用户的旧口令
<NEWPASSWORD>8888</NEWPASSWORD > // 用户的新口令
</PARAMS>
</REQUEST>
XML文档2
<REQUEST> //表明这是一个请求
//客户信息
<USER>
<UserID>Tom</UserID> //UserID:用户代号
</USER>
//消息参数区
<METHOD>Login</METHOD>
<PARAMS>
<PASSWORD>8888</PASSWORD > // 用户的新口令
</PARAMS>
</REQUEST>
1. 1个schema就可以了。
对schema的使用见:http://www.w3.org/TR/2001/REC-xmlschema-0-20010502/
2. XML的精髓在于可以自己随意定义标记。只要自己觉得合适即可。
<?xml version = "1.0"?>
<xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
xmlns:request = "request" targetNamespace = "request"
elementFormDefault = "qualified">
<xsd:element name = "REQUEST">
<xsd:complexType>
<xsd:sequence>
<xsd:element name = "USER" type = "xsd:string" />
<xsd:element name = "METHOD" type = "request:METHODNAMES" />
<xsd:element ref = "request:PARAMS" minOccurs = "0" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name = "PARAMS">
<xsd:all>
<xsd:element name = "OLDPASSWORD" type = "xsd:string" minOccurs = "0" />
<xsd:element name = "NEWPASSWORD" type = "xsd:string" minOccurs = "0" />
<xsd:element name = "PASSWORD" type = "xsd:string" minOccurs = "0" />
</xsd:all>
</xsd:element>
<xsd:simpleType name = "METHODNAMES">
<xsd:restriction base = "xsd:string">
<xsd:enumeration value = "ModifyPassword" />
<xsd:enumeration value = "Login" />
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
关于PARAMS定义,应该根据method的不同而有不同限制。但这样简单定义也可。
PARAMS和METHODNAMES的扩充自己可以照着添加。
关于如何将method name和param关联起来还想不出办法。
这个schema比上面那个要好一些,我认为。
<?xml version = "1.0"?>
<xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
xmlns:request = "request" targetNamespace = "request"
elementFormDefault = "qualified">
<xsd:element name = "REQUEST">
<xsd:complexType>
<xsd:sequence>
<xsd:element name = "USER" type = "xsd:string" />
<xsd:element ref = "request:METHODCALL" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name = "METHODCALL">
<xsd:complexType>
<xsd:sequence>
<xsd:element name = "METHOD" type = "request:METHODNAMES" />
<xsd:element ref = "request:PARAM" minOccurs = "0" />
</xsd:sequence>
</xsd:element>
<xsd:element name = "PARAM">
<xsd:complexType>
<xsd:attribute name = "NAME" type = "xsd:string" minOccurs = "0" />
<xsd:attribute name = "VALUE" type = "xsd:string" minOccurs = "0" />
</xsd:complexType>
</xsd:element>
<xsd:simpleType name = "METHODNAMES">
<xsd:restriction base = "xsd:string">
<xsd:enumeration value = "ModifyPassword" />
<xsd:enumeration value = "Login" />
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>