Powershell XSD 0-任意顺序的无限节点
XSD是否可以允许一组有限的子节点名称,但允许每个节点以任何顺序有0到无限的实例 据我所知,Powershell XSD 0-任意顺序的无限节点,powershell,xsd,Powershell,Xsd,XSD是否可以允许一组有限的子节点名称,但允许每个节点以任何顺序有0到无限的实例 据我所知,ns:any允许任何顺序,但每个顺序的实例不超过一个,ns:sequence需要指定的顺序,而ns:choice仅将您限制为列表中的一个 但我似乎也不能只拥有一个没有顺序指示符的ns:simpleType或ns:complexType 或者,我可以导入我的XML,而无需根据XSD进行验证,然后根据每个所需节点自己的XSD进行验证,但我似乎找不到直接验证[XML.Element]的方法。也许我可以使用每个节
ns:any
允许任何顺序,但每个顺序的实例不超过一个,ns:sequence
需要指定的顺序,而ns:choice
仅将您限制为列表中的一个
但我似乎也不能只拥有一个没有顺序指示符的ns:simpleType
或ns:complexType
或者,我可以导入我的XML,而无需根据XSD进行验证,然后根据每个所需节点自己的XSD进行验证,但我似乎找不到直接验证[XML.Element]
的方法。也许我可以使用每个节点并从中创建一个临时的[Xml.Document]
来进行验证,但据我所知,根据XSD验证Xml的唯一方法是在读取文件时,而仅仅为了验证节点而编写数百到数千次临时文件似乎效率极低
我花了很多时间开发我的XSD,所以我希望有一个基于XSD的解决方案。但是,至少所有这些工作都产生了比我以前得到的更加一致的XML,并且XSD练习为验证XML所需的代码提供了一个排序规范。这里有一些安慰
编辑:我找到的潜在解决方案是创建一个ns:group
,其中包含一个ns:choice
,该选项包含所有子节点作为minOccurs='0'maxOccurs='1'
,然后使用
引用需要这些节点的组。仍然不理想,因为另一个微妙之处是在两个地方,我只需要任务(其中可能有30个),在另一个地方,我还需要允许一个名为
的节点,可以与其他任务节点穿插在一起。在这一点上,我有两个小组,其中绝大多数都是相同的30个任务,唯一的区别是一个小组也有一个
。而且似乎没有办法一起使用ns:group
、ns:union
和ns:choice
来获得所需的结果。该死的微软
丑陋,我可能仍然会放弃XSD,编写自己的验证代码
编辑:我确实尝试过像这样使用ns:extension
,但我得到了一个错误,http://www.w3.org/2001/XMLSchema:extension'元素在此上下文中不受支持。
<xs:complexType name='TaskList'>
<xs:choice>
<xs:element name='taskCopy' type='Task_Copy' minOccurs='0' maxOccurs='1'/>
<xs:element name='taskCreateFolder' type='Task_CreateFolder' minOccurs='0' maxOccurs='1'/>
<xs:element name='taskDelete' type='Task_Delete' minOccurs='0' maxOccurs='1'/>
<xs:element name='taskExecuteProgram' type='Task_ExecuteProgram' minOccurs='0' maxOccurs='1'/>
<xs:element name='taskInstallProgram' type='Task_InstallProgram' minOccurs='0' maxOccurs='1'/>
<xs:element name='taskInventoryHardware' type='Task_InventoryHardware' minOccurs='0' maxOccurs='unbounded'/>
<xs:element name='taskInventorySoftware' type='Task_InventorySoftware' minOccurs='0' maxOccurs='unbounded'/>
<xs:element name='taskManageAsset' type='Task_ManageAsset' minOccurs='0' maxOccurs='1'/>
<xs:element name='taskManageNetworkLocation' type='Task_ManageNetworkLocation' minOccurs='0' maxOccurs='1'/>
<xs:element name='taskManageManageMappedDrive' type='Task_ManageManageMappedDrive' minOccurs='0' maxOccurs='1'/>
<xs:element name='taskManageZipFile' type='Task_ManageZipFile' minOccurs='0' maxOccurs='1'/>
<xs:element name='taskMirror' type='Task_Mirror' minOccurs='0' maxOccurs='1'/>
<xs:element name='taskSetRegistryValue' type='Task_SetRegistryValue' minOccurs='0' maxOccurs='1'/>
</xs:choice>
</xs:complexType>
<xs:complexType name='PackageList'>
<xs:extension base="TaskList">
<xs:choice>
<xs:element name='package' type='xs:string' minOccurs='0' maxOccurs='1'/>
</xs:choice>
</xs:extension>
</xs:complexType>
有30个不同的任务选项,其中任何一个都可以嵌套在任务的
节点中。它们也可以出现在
中,但包也可以包含另一个嵌套的
,它本身包含任务和包。任务和包的顺序都是可变的
目标是不需要维护重复的任务列表来处理包节点中的内容与任务预处理节点中的内容之间的差异。定义一个包含所有可选子项的选项的复杂类型,并将该复杂类型分配给所有子项的父项
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Root" type="randomType"/>
<xs:complexType name="randomType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="a"/>
<xs:element name="b"/>
<xs:element name="c"/>
</xs:choice>
</xs:complexType>
</xs:schema>
这样的xml仍然有效
<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<b>a</b>
<a>text</a>
<b>a</b>
<b>a</b>
<b>a</b>
<b>a</b>
<b>a</b>
<a>text</a>
</Root>
A.
文本
A.
A.
A.
A.
A.
文本
关键是,我有一个大的ns:choice
,我可以调用a-z,然后我有另一个ns:choice
,我可以调用1-3,我有两个位置可以使用a-z,第三个位置需要a-z和1-3。这是我似乎无法做到的两种选择的结合。似乎我需要维护两个a-z副本,一个还定义了1-3,另一个没有。或者我在这里遗漏了什么?您可以添加一个想要用xsd描述的xml示例吗。从文本中我无法完全理解您想要实现的目标。我用一些示例XML修改了原始帖子。希望这是有道理的。
<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<b>a</b>
<a>text</a>
<b>a</b>
<b>a</b>
<b>a</b>
<b>a</b>
<b>a</b>
<a>text</a>
</Root>