【发布时间】:2021-01-28 12:36:27
【问题描述】:
我有一个 XML 节点,它可以包含一个(必需的)A 子节点和一个(可选的)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 的验证?或者在将字符串转换为 [XML] 类型时,XSD 验证是否仅限于与 $xmlReaderSettings.ValidationType 一起使用?我想我可以将我的单个节点转换回一个字符串,然后用一个使用辅助 XSD 文件的阅读器重新读取它,但这似乎变得混乱到不值得付出努力,并且只需编写第二遍验证代码就可以获得更多感觉。我更喜欢诚实地在 XML 文件级别验证这一点的想法,因为这样我可以轻松地在日志中提供文件名和行号以及问题,从而使 XML 修订更加容易。任何二级验证都好像我丢失了原始行号。
还有一个相关的问题:我不断看到对 XSD 1.1 的引用提供了更多选项。但这些帖子往往有 4-5 年的历史。 powerShell 现在是在使用 XSD 1.1,还是可以,还是我们还在等待呢?
【问题讨论】:
-
参考你上一个问题; PowerShell 在幕后使用 .NET,并且没有 XSD v1.1 的 .NET 实现,不幸的是只有 v1。考虑到 XSD v1.1 于 2012 年问世,不太可能添加 XSD v1.1 支持。
标签: xml powershell xsd