0
我想用xsd模式文件來驗證xml文檔。 xml文檔包含有關Windows服務的信息,我想將Name
屬性Service
設置爲唯一值。xpath不能正常工作的唯一屬性
這裏是一個小的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
相同。
我錯了什麼?我發現這個how to make an attribute unique in xml schema?和XML XSD Schema - Enforce Unique Attribute Values in Schema。這裏有什麼不同?
謝謝,我會測試它瞬間的明天!您使用了哪種工具?我看到有xmlns,xmlns:tns和targetNamespace具有相同的值,是必要的嗎?我也試過它沒有命名空間,我刪除了targetNamespace,但不工作,爲什麼?有一個美好的一天。 – hofmeister 2013-05-14 19:32:58
@hofmeister,targetNamespace必須符合您的要求;您不需要使用相同的值定義默認名稱空間;然而,許多人認爲這是最佳做法; tns是任意的,你仍然需要爲你的targetNamespace定義一個別名並使用它,因爲這些元素是合格的,如果沒有前綴,選擇器/字段中的XPath不會假定名稱空間,也不會默認命名空間。該工具是[QTAssistant](http://www.paschidev.com),這是我們開發的。 – 2013-05-15 02:35:01
但是,如果我在服務下移動約束並設置默認名稱空間xmlns,它爲什麼不起作用?我不明白爲什麼我需要xmls,xmls:prefix和targetnamespace ..如果你能解釋它,那將是很好的! – hofmeister 2013-05-15 06:46:43