如何解决XSD节点“集”
我有一个XML节点,它可以包含一个(必需的)子节点和一个(可选的)B子节点,或者它可以包含一个(必需的)Y子节点和一个(可选的)Z子节点。但是,如果包含A节点,则不能包含Y或Z节点。 所以这些都是有效的
<node>
<a />
<b />
</node>
<node>
<a />
</node>
<node>
<y />
<z />
</node>
<node>
<y />
</node>
但是这些不是
<node>
<a />
<y />
</node>
<node>
<b />
<y />
</node>
<node>
<b />
<z />
</node>
<node>
<b />
</node>
似乎替代组或选择指标无法完成任务,虽然元素组允许我将B视为A问题的允许同伴,但如果出现以下情况,我看不到排除Y组的方法:已经找到一个组。
我错过了什么吗?还是在这种情况下,我只将所有四个可能的节点都包含在一个组中,所以如果有一个永远无效的M或N节点,那么我的验证就会失败,然后我需要编写代码进行第二层验证?如果是这样,是否可以(在PowerShell中)在.SelectSingleNode()
之后对特定节点进行基于XSD的验证?还是将字符串转换为$xmlReaderSettings.ValidationType
类型时将XSD验证限制为与[XML]
一起使用?我想我可以将我的单节点转换回字符串,然后使用使用辅助XSD文件的阅读器重新读取它,但这似乎变得很杂乱,不值得付出努力,而编写第二遍验证代码会带来更多好处感。我更喜欢诚实地在XML文件级别进行验证的想法,因为这样我就可以轻松地在日志中提供文件名和行号以及问题,从而使XML修订更加容易。任何第二级验证似乎都丢失了原始行号。
和一个相关的问题:我不断看到对提供更多选项的XSD 1.1的引用。但是这些职位通常是4-5岁。 powerShell是现在使用XSD 1.1,还是可以使用,还是我们还在等待?
解决方法
我认为您可以通过在选择之后定义几个序列来使用该选择。参见下面的示例
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="node" maxOccurs="unbounded">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="a"/>
<xs:element name="b" minOccurs="0"/>
</xs:sequence>
<xs:sequence>
<xs:element name="y"/>
<xs:element name="z" minOccurs="0"/>
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。