用于表示键值对的XML Schema

时间:2016-02-11 14:29:35

标签: xml xsd key-value

在我的Java程序中,我想将XML解析为Map。为此,我想创建一个模式,确保键名是唯一的,并且没有嵌套。例如,这将是有效的:

<?xml version="1.0" encoding="UTF-8"?>
<Data>
    <WaterLevel>4.1</WaterLevel>
    <Voltage>5</Voltage>
    <Pressure>30</Pressure>
</Data>

也就是说,不应该有超过2层的嵌套(即只允许在根下面一层)。此外,元素名称必须是唯一的。例如,不应该有2个“WaterLevel”元素。我需要什么XSD来强制执行此操作?

1 个答案:

答案 0 :(得分:1)

  

我很想知道如何在XSD 1.1中完成,只是为了理解这一挑战。

确保任意元素名称是唯一的是动态和文档范围的约束。它是动态的,因为元素名称不能提前定义(通常在XSD文档中完成)。

在我看来,你的问题不适合XSD,但可以用XSD 1.1完成。在那里,您可以使用测试XPath表达式的断言。这是一个例子:

XML Schema 1.1

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

    <xs:element name="Data">
        <xs:complexType>
            <xs:sequence>
                <!--Allowing arbitrary element names-->
                <xs:any maxOccurs="unbounded" processContents="lax"/>
            </xs:sequence>
            <!--Element names must be unique-->
            <xs:assert test="every $child in * satisfies not($child/preceding::*[name() = name($child)])"></xs:assert>
        </xs:complexType>
    </xs:element>

</xs:schema>

上面的架构会认为您的文档有效,但会拒绝像

这样的文档
<?xml version="1.0" encoding="UTF-8"?>
<Data>
    <WaterLevel>4.1</WaterLevel>
    <Voltage>5</Voltage>
    <Pressure>30</Pressure>
    <Voltage/>
</Data>

Voltage元素出现两次。但我必须强调,这可能是一个坏主意,并且您无法控制实例文档的XML内容 - 而控制是XML验证的全部要点。

有关任意元素名称可行性的更多解释,请参阅this related answer。 Michael Kay的回答是:XML设计中元素名称是任意的,设计得非常糟糕。