请教各位大侠一个问题,先谢谢了。
我想用XML来实现这样一个功能:B通过检查A发送来的XML文档的<METHOD>元素的内容来识别A的请求想干什么,并提取相应的数据。
举个例子:
  John收到一个XML文档(如下面的XML文档1),John通过提取元素<UserID>的内容得知这是Mike发来的请求,然后检查文档中元素<METHOD>的内容得知Mike想修改口令,然后John再从元素<OLDPASSWORD>中取出Mike的旧口令,判断文档中的旧口令是否正确(当然,前提是John知道真正的Mike的旧口令)。如果口令正确,那么John接着从元素<NEWPASSWORD>中提取出Mike的新口令并保存起来。
  同样,John如果收到一个XML文档(如下面的XML文档2),就可以处理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. 1个schema就可以了。
    对schema的使用见:http://www.w3.org/TR/2001/REC-xmlschema-0-20010502/
    2. XML的精髓在于可以自己随意定义标记。只要自己觉得合适即可。
      

  2.   

    yu_hl,你好!
       是否能够帮我设计一下这个Schema呢,比如说,我现在就要处理我在上文例子中提出的两个请求,一个登录,一个修改口令,如何设计一个Schema来满足我的要求。虽然我觉得这个请求可能有点过分,但是我现在时间真得很紧张,实在没有时间允许我去从头开始学习schema了,如果你能够给我更多的提示也可以,或者是否能够提供一个较为相近的例子也好。如果能得到你的帮助,我将非常,非常感激。
      

  3.   

    <?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的扩充自己可以照着添加。
      

  4.   

    yu_hl:
        非常感谢你提供的例子,我真的很想进一步知道如何在定义PARAMS时,根据method的不同而有不同的限制。因为如果不能在一个Schema中表达出不同的method对应的不同的PARAMS定义,我就要为每个method写一个XML文档范例了,那么就达不到用一个Schema来描述的目的了。如果XML中有Switch语句就好了(我乱想的)。
        无论如何,先要谢谢你!
      

  5.   

    关于如何将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>