【问题标题】:XSD node "sets"XSD 节点“集”
【发布时间】: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


【解决方案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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多