在powershell中针对xsd-schema验证可选属性

时间:2017-01-24 05:42:54

标签: xml powershell xsd

我需要通过powershell脚本对xsd验证xml,并提供有关可选属性的警告等。 例如,My xsd:

while

和xml:

    <?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">


  <xs:complexType name="LocalizedValue">
    <xs:attribute name="Lang" type="xs:string" use="required">
      <xs:annotation>
        <xs:documentation>Language Code</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="Name" type="xs:string" use="required">
      <xs:annotation>
        <xs:documentation>District Typr</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="ShortName" type="xs:string" use="optional">
      <xs:annotation>
        <xs:documentation>Аbbreviation</xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:complexType name="DistrictType">
    <xs:sequence>
      <xs:element name="Localizations" minOccurs="1" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Localization" type="LocalizedValue"  minOccurs="1" maxOccurs="unbounded">
              <xs:annotation>
                <xs:documentation>Local attributes</xs:documentation>
              </xs:annotation>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Branches">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Branch" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:attribute name="Code" type="xs:int" use="required">
                  <xs:annotation>
                    <xs:documentation>Branch Code</xs:documentation>
                  </xs:annotation>
                </xs:attribute>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="Code" type="xs:int" use="required">
      <xs:annotation>
        <xs:documentation>Dictionary code</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="GroupCode" type="xs:int" use="optional">
      <xs:annotation>
        <xs:documentation>Another Code</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="IsDeleted" type="xs:boolean" use="optional" default="false">
      <xs:annotation>
        <xs:documentation>
         documentation
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:element name="DistrictType" type="DistrictType">
    <xs:annotation>
      <xs:documentation>documentation</xs:documentation>
    </xs:annotation>
  </xs:element>
</xs:schema>

我需要得到一些这样的信息:

警告:缺少可选属性“GroupCode”。

我使用powershell脚本验证:

<DistrictType Code="1" IsDeleted="false" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./../Schema/flowGeoClassifier.DistrictType.xsd">
  <Localizations>
    <Localization Lang="ru" Name="район" ShortName="р-н" />
  </Localizations>
  <Branches>
    <Branch Code="1" />
  </Branches>
  <Countries>
    <Country Code="1" />
    <Country Code="483647" />
    <Country Code="2147483647" />
  </Countries>
</DistrictType>

ValidationEventHandler是否通过标准方法验证可选属性?

2 个答案:

答案 0 :(得分:0)

XmlReader认为缺少的可选属性完全有效,因此不会引发错误(或警告)。

自己获取此类信息的唯一方法是手动检查它们。您可以通过将文档读入XmlDocument然后running XPath查询来相当容易地完成此操作。

答案 1 :(得分:0)

为什么不创建一个必需属性的模式变体,然后对其进行验证?

架构是黑白的,事情要么有效,要么没有:警告的空间不大。但是,您不必一直使用相同的模式,您可以使用具有不同严格级别的模式在不同阶段进行验证。