在我的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来强制执行此操作?
答案 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设计中元素名称是任意的,设计得非常糟糕。