0

我想用 xsd 模式文件验证 xml 文档。xml 文档包含有关 Windows 服务的信息,我想将Name属性 from设置Service为唯一值。

这是一个小的 xml 示例:

<?xml version="1.0" encoding="utf-8"?>
<Services xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://example.de/xml/services">
  <Service Name="ALG" StartMode="Manual" State="Stopped">
    <DisplayName>xyz</DisplayName>
  </Service>
  <Service Name="AllUserInstallAgent" StartMode="Manual" State="Stopped">
    <DisplayName>xyz</DisplayName>
  </Service>
  <Service Name="AllUserInstallAgent" StartMode="Manual" State="Stopped">
    <DisplayName>xyz</DisplayName>
  </Service>
    <Service Name="AllUserInstallAgent" StartMode="Manual" State="Stopped">
    <DisplayName>xyz</DisplayName>
  </Service>
</Services>

我尝试使用xpath:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://example.de/xml/services" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://example.de/xml/services">
  <xsd:element name="Services">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element maxOccurs="unbounded" name="Service">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="DisplayName" type="xsd:string" />
            </xsd:sequence>
            <xsd:attribute name="Name" type="xsd:string" use="required" />
            <xsd:attribute name="StartMode" type="xsd:string" use="required" />
            <xsd:attribute name="State" type="xsd:string" use="required" />
          </xsd:complexType>
          <xs:unique name="Unique-Name">
            <xs:selector xpath="Service" />
            <xs:field xpath="@Name" />
          </xs:unique>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xs:schema>

但遗憾的是 xml 文档仍然有效。请注意,有些记录具有相同的Name.

我做错了什么?我发现这如何使属性在 xml 模式中唯一?XML XSD Schema - 在 Schema 中强制使用唯一的属性值。这里有什么不同?

4

1 回答 1

2

这是关于范围和命名空间的。

如果您可视化您的结构,并记住选择器植根于与约束相关联的元素...

在此处输入图像描述

您可能会注意到您正在寻找“服务...”下的“服务”,但该服务不存在。因此,第一步是将其移动到适当的元素(服务)下。

在此处输入图像描述

以上仍然不起作用的原因与您使用命名空间并且元素是合格的这一事实有关。这意味着您必须为目标命名空间添加一个 XML 命名空间前缀(此处为 tns)。所以这是您更正后的 XSD:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://example.de/xml/services" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://example.de/xml/services" xmlns:tns="http://example.de/xml/services">
    <xsd:element name="Services">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element maxOccurs="unbounded" name="Service">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="DisplayName" type="xsd:string"/>
                        </xsd:sequence>
                        <xsd:attribute name="Name" type="xsd:string" use="required"/>
                        <xsd:attribute name="StartMode" type="xsd:string" use="required"/>
                        <xsd:attribute name="State" type="xsd:string" use="required"/>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xs:unique name="Unique-Name">
            <xs:selector xpath="tns:Service"/>
            <xs:field xpath="@Name"/>
        </xs:unique>
    </xsd:element>
</xs:schema>

这将适当地标记您的 XML:

Error occurred while loading [], line 11 position 5
There is a duplicate key sequence 'AllUserInstallAgent' for the 'http://example.de/xml/services:Unique-Name' key or unique identity constraint.
Error occurred while loading [], line 14 position 5
There is a duplicate key sequence 'AllUserInstallAgent' for the 'http://example.de/xml/services:Unique-Name' key or unique identity constraint.
于 2013-05-14T17:59:45.173 回答