XSD耦合两个XML元素的值?

时间:2016-09-17 19:32:50

标签: xml xsd xsd-validation xml-validation

我的程序可以返回2个XML,如:

<RESPONSE>
    <ERROR_ID>1</ERROR_ID>
    <ERROR_MESSAGE>Parse error</ERROR_MESSAGE>
</RESPONSE>

<RESPONSE>
    <ERROR_ID>2</ERROR_ID>
    <ERROR_MESSAGE>Unexpected attribute</ERROR_MESSAGE>
</RESPONSE>

我尝试写一些XSD文件来验证它们是否正常。在这里我最终得到了:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="qualified">

    <xsd:element name="RESPONSE" type="Response"/>

    <xsd:complexType name="Response">
        <xsd:all>
            <xsd:element name="ERROR_ID" type="ErrorId"/>
            <xsd:element name="ERROR_MESSAGE" type="ErrorMessage"/>
        </xsd:all>
    </xsd:complexType>

    <xsd:simpleType name="ErrorId">
        <xsd:restriction base="xsd:positiveInteger">
            <xsd:enumeration value="1"/>
            <xsd:enumeration value="2"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="ErrorMessage">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="Parse error"/>
            <xsd:enumeration value="Unexpected attribute"/>
        </xsd:restriction>
    </xsd:simpleType>

</xsd:schema>

它验证正常,但我在想是否可以将错误ID与错误消息链接到不通过验证文件,其中错误id = 2将使用id = 1的错误消息:

<RESPONSE>
    <ERROR_ID>2</ERROR_ID>
    <ERROR_MESSAGE>Parse error</ERROR_MESSAGE>
</RESPONSE>

有一个很好的方法吗?我的程序当然会返回更多的错误ID和消息。

也许更好的问题是我是否应该期待从XSD进行这样的验证?

1 个答案:

答案 0 :(得分:1)

XSD 1.0 无法根据其他元素的值限制一个元素的值。

XSD 1.1 可以使用xsd:assert执行此操作,但是您应该重新考虑您的设计......

其他设计建议:

  1. 请勿查看XSD中的ERROR_ID - ERROR_MESSAGE配对。

  2. 将错误ID与错误消息连接:

    <Error>1. Parse error</Error>
    
  3. 针对更具体的错误元素名称使用了固定属性:

    <ParseError id="1" message="Parse error"/>
    <UnexpectedAttributeError id="2" message="Unexpected attribute"/>
    
  4. 这些替代设计都不需要XSD 1.1。